【问题标题】:How to bind DataGrid to more collections?如何将 DataGrid 绑定到更多集合?
【发布时间】:2016-10-08 12:01:29
【问题描述】:

我有一个绑定到 ObservableCollection (StoredSequences<Sequence>) 的 DataGrid:

<DataGrid ItemsSource="{Binding StoredSequences}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding ID}" >
                <DataGridTextColumn.ElementStyle>
                    <Style>
                        <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding NameEnglish}" >
                <DataGridTextColumn.ElementStyle>
                    <Style>
                        <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

序列模型:

public class Sequence : INotifyPropertyChanged
{
    public Sequence() { }

    private int _id;
    public int ID
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("ID");
        }
    }
    private string _nameEnglish;
    public string NameEnglish
    {
        get
        {
            return _nameEnglish;
        }
        set
        {
            _nameEnglish = value;
            OnPropertyChanged("NameEnglish");
        }
    }
    private int _value;
    public int Value
    {
        get
        {
            return _value;
        }
        set
        {
            _value= value;
            OnPropertyChanged("Value");
        }
    }
    private string _category;
    public string Category
    {
        get
        {
            return _category;
        }
        set
        {
            _category = value;
            OnPropertyChanged("Category");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

我想在网格的最后两列中添加两个 ComboBox,并将 ItemsSource 绑定到其他 ObservableCollections(在 ViewModel 中生成Values&lt;int&gt;Categories&lt;string&gt;)。我可以添加文本框,因为Sequence 包含ValueCategory,但我希望用户能够选择这些项目。我试过这个:

                <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="ComboBox1" ItemsSource="{Binding Values}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="ComboBox2" ItemsSource="{Binding Categories}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

问题是组合框是空的。这是收到的错误之一:

System.Windows.Data Error: 40 : BindingExpression path error: 'Values' property not found on 'object' ''Sequence' (HashCode=31195541)'. BindingExpression:Path=Values; DataItem='Sequence' (HashCode=31195541); target element is 'ComboBox' (Name=ComboBox1'); target property is 'ItemsSource' (type 'IEnumerable')

将 DataGrid 绑定到更多集合的正确方法是什么?或者我怎样才能在 CellEdit 和 TextBox 上显示 ComboBoxes?

【问题讨论】:

  • StoredSequencesObservableCollection 存储StoredSequences-es 或Sequence?我不完全明白。顺便说一句,我会像 StoredSequences 那样做 ObservableCollection 的视图模型
  • @ntohl 它存储序列。
  • 你能粘贴序列类吗?我对 Values 和 Categories 属性感兴趣

标签: c# wpf xaml datagrid observablecollection


【解决方案1】:

您可以从错误消息中看到绑定失败,因为框架找不到序列类型对象的值和类别属性。发生这种情况是因为 DataGrid 中的每一行都将基础序列作为其 DataContext。

如果您不想将 Values 和 Categories 集合添加到 Sequence 对象,那么您需要做的是更改您的 Bindings 以便它们绑定到父 DataContext,而不是行 DataContext。

试试这个例子,它将绑定重定向到 DataGrid 的 DataContext:

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ComboBox2" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Categories}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

【讨论】:

  • 对不起,我早该发现的。很高兴它对你有足够的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2014-10-05
  • 2011-10-24
相关资源
最近更新 更多