【问题标题】:WPF Databinding combobox in a datagrid [duplicate]数据网格中的WPF数据绑定组合框[重复]
【发布时间】:2018-05-21 09:32:08
【问题描述】:

我对 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>

这是视图模型:

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);
        }
    }
}

还有 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 中制作带有组合框的堆栈面板是唯一可以显示组合框的解决方案,但绑定在这里毫无意义。

【问题讨论】:

  • 你忘记了你的物品来源作为绑定
  • 在 DataGridComboBoxColoumn 中?添加绑定(我想是到 DummyFruitList)什么都不做。
  • 我发布了答案。你可以看看。并使用 ObservableCollection 而不是列表。
  • 是的,使用 OC 并始终将您的收藏属性设为只读。
  • 我实际上最终使用了这个答案中提出的 DataGridTemplateColumn:stackoverflow.com/questions/7088284/…,因为所提供的解决方案都没有让我看到任何组合框,所以我没有任何机会正确测试答案。对这个答案的正确回应是什么?

标签: c# wpf xaml mvvm combobox


【解决方案1】:

缺少 ComboBox 的 ItemsSource,请使用 ObservableCollection 而不是 List。那应该行得通;

   <DataGridComboBoxColumn Header="Unit" >
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.DummyUnitList}"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
            </DataGridComboBoxColumn>

【讨论】:

    【解决方案2】:

    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 类的属性

    DummyUnitList 应该是 ObservableCollection&lt;&gt; 而不是 List&lt;&gt;

    public ObservableCollection<Unit> DummyUnitList 
    {
        get => _dummyUnitList ;
        set { _dummyUnitList = value; OnPropertyChanged(nameof(DummyUnitList)); }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2013-03-19
      • 1970-01-01
      • 2012-06-05
      • 2014-01-08
      • 2012-10-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多