这个问题在这里已经有了答案:
Binding ItemsSource of a ComboBoxColumn in WPF DataGrid
(8 个回答)
4年前关闭。
我对 WPF 和 MVVM 很陌生,所以我可能缺少一些基本的了解。
我正在尝试建立一个可以订购的提要列表。每个订单都需要名称、数量和单位。
这些单位应该放在一个组合框中,这就是问题所在。根据方法的不同,组合框不会出现,或者只是空的。
以下是 XAML。
<UserControl x:Class="TestProject.View.FruitFoodList"
DataContext="{Binding Test, Source={StaticResource Locator}}">
<Grid>
<DataGrid ItemsSource="{Binding DummyFruitList}" IsReadOnly="True" Name="dgFeedList" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Feed" Binding="{Binding Name}" Width="*"/>
<DataGridTemplateColumn Header="Amount">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!-- Code for amount here -->
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridComboBoxColumn Header="Unit">
<!--Combobox for units here-->
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
这是 View 模型:
public class DummyViewModel : ViewModelBase
{
private List<DummyProduct> _dummyFruit = new List<DummyProduct>();
public List<DummyProduct> DummyFruitList
{
get { return _dummyFruit; }
set { _dummyFruit = value; }
}
public List<Unit> DummyUnitList = new List<Unit> {
new Unit { Name = "kg"},
new Unit { Name = "piece(s)" },
new Unit { Name = "box(es)" }
};
public DummyViewModel()
{
string[] lines = File.ReadAllLines("../../DummyFruit.txt", Encoding.UTF7);
foreach (string product in lines)
{
DummyProduct dummyProduct = new DummyProduct(product);
dummyProduct.Units = DummyUnitList;
DummyFruitList.Add(dummyProduct);
}
}
}
和虚拟产品:
public class DummyProduct
{
public DummyProduct(string product)
{
Name = product;
}
public string Name { get; set; }
public List<Unit> Units;
}
每个产品的单位可能不同。
我没有运气,尝试了以下解决方案:
Binding WPF ComboBox to a Custom List
Binding ItemsSource of a ComboBoxColumn in WPF DataGrid
上述解决方案对我来说根本没有显示组合框。
但同样,我可能做错了。
迄今为止,在 datagridtemplate 中制作带有组合框的堆栈面板是唯一让组合框出现的解决方案,但绑定(bind)在这里毫无意义。
最佳答案
XAML 为您的 DataGrid 组合框列
<DataGridComboBoxColumn Header="Unit" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValueBinding="{Binding UnitId, UpdateSourceTrigger=PropertyChanged}" MinWidth="280" Width="Auto" IsReadOnly="False">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DummyUnitList, UpdateSourceTrigger=PropertyChanged}"/>
<Setter Property="Width" Value="280" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DummyUnitList, UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
SelectedValueBinding="{Binding UnitId, UpdateSourceTrigger=PropertyChanged}"
在哪里 UnitId
是您 DataGrid ItemsSource 的一个元素,这是您选择的要存储在数据库中的值(或从中读取)DisplayMemberPath="Name"
SelectedValuePath="Id"
在哪里 Id
和 Name
是 Unit
的属性类(class)虚拟单元列表 应该是
ObservableCollection<>
而不是 List<>
public ObservableCollection<Unit> DummyUnitList
{
get => _dummyUnitList ;
set { _dummyUnitList = value; OnPropertyChanged(nameof(DummyUnitList)); }
}
关于c# - 数据网格中的 WPF 数据绑定(bind)组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47692298/