组合框所选项目在数据网格内不工作
本文关键字:网格 数据网 工作 数据 选项 项目 组合 | 更新日期: 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方式传递文本数据。
您可以为属性选择任何名称,只要收到用户
键入的文本,就可以填充网格。你也可以选择传入视图模型,以便设置属性,执行一些方法等