c# - 数据网格中的 WPF 数据绑定(bind)组合框

标签 c# wpf xaml mvvm combobox

这个问题在这里已经有了答案:





Binding ItemsSource of a ComboBoxColumn in WPF DataGrid

(8 个回答)


4年前关闭。




我对 WPF 和 MVVM 很陌生,所以我可能缺少一些基本的了解。

我正在尝试建立一个可以订购的提要列表。每个订单都需要名称、数量和单位。

enter image description here

这些单位应该放在一个组合框中,这就是问题所在。根据方法的不同,组合框不会出现,或者只是空的。

以下是 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"在哪里 IdNameUnit 的属性类(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/

相关文章:

c# - MVVM,Catel和图形UI交互

c# - XAML - 逗号分隔的依赖属性

c# - 如何使用 Rx 遍历一系列带有停顿和淡入淡出的字符串?

c# - Eazfuscator.NET 破坏了 Enum.IsDefined

c# - TabControl中的WPF MVVM多个ContentControls

c# - C# 中的矩阵乘法方法

xaml - 如何解决 Metro 风格应用程序中 XAML 中 webview 控件的 z-index 问题?

c# - 在 ListView UWP 中选择项目时选中复选框

wpf - Powershell 包 uri 对象

c# - 在 Windows 资源管理器中获取拖放文件的文件路径