组合框选择的项目在datagrid中不起作用

时间:2014-06-10 07:24:50

标签: c# wpf mvvm datagrid combobox

我有一个数据网格,我将一列作为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>

我的要求是:

当Combobox文本更改时,我使用Items填充CustomDatagrid,用户可以从CustomDatagrid中选择一个项目,selectedobtem(ProductName)显示在Combobox上。

我的viewModel:

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中选择一个项目时,combobox.Text获得了“RH_Maize.View.CustomDatagrid”文本而不是ProductName。我的代码出错了吗?

1 个答案:

答案 0 :(得分:1)

我建议你选择popup方法,它看起来像一个带有按钮的文本框,打开弹出窗口

因此该列的模板将有一个用户可以键入的文本框和一个弹出窗口,您可以在其中托管子控件(在您的情况下为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

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

将自定义控件SearchKey中的假定属性CustomDatagrid绑定到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方式传递文本数据。

您可以选择拥有该属性的任何名称,只要您收到用户输入的文本,我们就可以填充网格

您也可以选择传入视图模型以设置属性,执行某些方法等。