【问题标题】:Datagridcomboboxcolumn bind to ObservableCollection in item of Datagrid sourceDatagridcomboboxcolumn 绑定到 Datagrid 源项中的 ObservableCollection
【发布时间】:2014-02-14 09:16:25
【问题描述】:

我有两列数据网格:文本和组合框。并且组合框应该绑定到可观察的集合。

这是数据网格项目源的伪代码:

    public class ModeObjectState
    {
        public int ID { get; set; }
        public int ObjectTypeID { get; set; }
        public string State { get; set; }
    }

    public class ModeObject
    {
         public string Name { get; set; }
         public int objID { get; set; }
         public int Type { get; set; }
         public int StateID { get; set; }
         public bool Format { get; set; }
    }

    public class _dataContext
    {
        public ObservableCollection<ModeObjectState> ListObjectState { get; set; }
        public ModeObject ModeObj { get;  set; }
    }

    ObservableCollection<_dataContext> SourceObjList
    objTable.ItemsSource = SourceObjList;

这是数据网格的 xaml 代码:

    <DataGrid x:Name="objTable" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="ColumnName" Binding="{Binding Path=ModeObj.Name}" IsReadOnly="True" />
            <DataGridComboBoxColumn x:Name="ColumnState" ItemsSource="{Binding ListObjectState}" DisplayMemberPath="State" SelectedValuePath="ID" SelectedValueBinding="{Binding Path=ModeObj.StateID}" /> 
        </DataGrid.Columns>
    </DataGrid>

但 datagrid 不显示组合框列中的任何项目。请帮助我将 datagridcombobox 绑定到“_dataContext”类中的可观察集合“ListObjectState”。

谢谢!

【问题讨论】:

  • 你在哪里填写集合SourceObjList和'ListObjectState'?
  • 我在窗口的构造函数中填充一次。
  • 你能在InitializeComponent调用之前做一件事初始化这些集合,看看是否有效。

标签: wpf xaml binding datagridcomboboxcolumn


【解决方案1】:

使用INotifyPropertyChanged 实现_dataContext

public class _dataContext : INotifyPropertyChanged
    {
        private ObservableCollection<ModeObjectState> _listObjectState;

        public ObservableCollection<ModeObjectState> ListObjectState
        {
            get { return _listObjectState; }
            set
            {
                _listObjectState = value; 
                OnPropertyChagned("ListObjectState");
            }
        }

        public ModeObject ModeObj { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChagned(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

由于第一组可能在Binding之后完成,所以不会影响UI..

【讨论】:

  • 这对我没有帮助。而且我找不到问题
【解决方案2】:

不看整个代码就很难弄清楚。您有绑定问题,使用SnoopWPF Inspector 等XAML 调试工具会更容易找到问题所在。您只需附加您正在运行的应用程序即可查看 Datacontext。

您可以轻松找到数据上下文是否有效。 WPF Inspector 具有更好的用户界面,但它容易崩溃。按 Ctrl+Shift 并将鼠标悬停在您的控件上,以查看它反映在 Snoop/WPF Inspected 中。

另请参阅“输出”窗口,了解您遇到的绑定错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2015-01-21
    • 2014-01-04
    • 2016-09-13
    • 2013-03-30
    • 2013-09-07
    • 2013-10-14
    相关资源
    最近更新 更多