组合框所选项目在数据网格内不工作

本文关键字:网格 数据网 工作 数据 选项 项目 组合 | 更新日期: 2023-09-27 18:07:48

我有一个数据网格,我把一列作为TemplateColumn。

这是我的Datagrid:

<DataGrid AutoGenerateColumns="False"
          x:Name="MainDataGrid"
          ItemsSource="{Binding OrderItems}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Width="230" Header="Product Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding ProductName,Mode=OneWay}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox 
                        Text="{Binding ProductName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                        <vw:CustomDatagrid />
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在CellEditingTemplate中我放了一个Combobox在里面我放了一个UserControl

这是我的UserControl:

<UserControl x:Class="RH_Maize.View.CustomDatagrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" Height="499" Width="560">
<Grid x:Name="LayoutRoot"  Width="560">
    <DataGrid ItemsSource="{Binding FilterdItems}"
              SelectedItem="{Binding SelectedFilterItem,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
              x:Name="CustomDataGrid"
             >
        <DataGrid.Columns>
            <DataGridTextColumn MinWidth="150"
                                Header="Category"
                                Binding="{Binding CategoryName,Mode=OneWay}"/>
            <DataGridTextColumn MinWidth="180"
                                Header="Item"
                                Binding="{Binding ProductName,Mode=OneWay}" />
            <DataGridTextColumn MinWidth="130"
                                Header="Rate"
                                Binding="{Binding Rate,Mode=OneWay}" />
            <DataGridHyperlinkColumn MinWidth="100" Header="Details"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

我的要求是:

当组合框文本改变时,我用Items填充CustomDatagrid,用户可以从CustomDatagrid中选择一个项目,selectedItem(ProductName)显示在组合框上。

我的视图模型:

public class ProductCartViewModel : ViewModelBase
{
    public ProductCartViewModel()
    {
        PopulateCustomGrid(string.Empty);
    }
    private string _productName;
    public string ProductName   
    {
        get { return _productName; }
        set
        {
            if (value != _productName)
            {
                _productName = value;
                PopulateCustomGrid(_productName);
                RaisePropertyChanged(() => ProductName);
            }
        }
    }
    private void PopulateCustomGrid(string productNameMatch)
    {
        List<ProductFilterModel> lstProduct = new List<ProductFilterModel>();
        using(var context=new MaizeEntities())
        {
            var items = from p in context.TblProducts
                        where p.ProductName.Contains(productNameMatch)
                        select p;

           foreach(var item in items)
           {
               ProductFilterModel product = new ProductFilterModel();
               product.CategoryName = item.TblProductCategory.CategoryName;
               product.ProductId = item.ProductId;
               product.ProductCode = item.ProductCode;
               product.ProductName = item.ProductName;
               product.Rate = item.PurchaseRate;
               lstProduct.Add(product);
           }
           FilterdItems = new ObservableCollection<ProductFilterModel>(lstProduct);
        }
    }
}
我问题:

当用户从CustomDataGrid中选择一个项目时,组合框。文本得到了"RH_Maize.View"。我的代码有什么问题?

组合框所选项目在数据网格内不工作

我建议你采用类似文本框的弹出式方式,在文本框的末尾有一个按钮来打开弹出式

因此,列的模板将有一个文本框,用户可以输入和一个弹出框,你可以托管子控件(在你的例子中是datagrid)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>
    <TextBox x:Name="text" />
    <ToggleButton Grid.Column="1"
                  Content="..."
                  x:Name="toggle" />
    <Popup PlacementTarget="{Binding ElementName=text}"
           IsOpen="{Binding IsChecked, ElementName=toggle}">
        <Border Background="White">
            <TextBlock Text="your child control here, eg datagrid" />
        </Border>
    </Popup>
</Grid>

弹出框将由按钮控制在最后,你也可以通过点击文本框打开

在弹出框中你可以放置你的数据网格等

DataGrid in popup

    <Popup PlacementTarget="{Binding ElementName=text}"
           IsOpen="{Binding IsChecked, ElementName=toggle}">
        <Border Background="White">
            <vw:CustomDatagrid SearchKey="{Binding Text, ElementName=text}}"/>
        </Border>
    </Popup>

将自定义控件CustomDatagrid中的假设属性SearchKey绑定到TextBox的Text属性,此绑定将推送文本框的值到控件中,您可以在其中执行过滤器搜索或其他逻辑来填充网格中的数据。

关于引入属性SearchKey的说明

When the Combobox text changes I populate the CustomDatagrid with Items ,user can select an item from the CustomDatagrid, the selectedItem(ProductName) is displayed on the Combobox.

对我来说,这意味着您需要将用户键入的文本传递给CustomDatagrid并填充网格,当用户从数据网格中选择一个项目时,您希望将其显示在组合框中。所以我假定属性SearchKey,它将帮助您以MVVM方式传递文本数据。

您可以为属性选择任何名称,只要收到用户

键入的文本,就可以填充网格。

你也可以选择传入视图模型,以便设置属性,执行一些方法等