【问题标题】:WPF Datagrid selectedItem not update sourceWPF Datagrid selectedItem 不更新源
【发布时间】:2013-04-12 16:04:25
【问题描述】:

我正在尝试使用 MVVM 模式处理数据网格。问题是当我第一次在数据网格中选择一个项目时,数据网格将正确更新源属性,然后我选择另一个项目,源属性不更新。这是我在 xaml 中的绑定:

<DataGrid ItemsSource="{Binding Customers}" 
          SelectedItem="{Binding SelectedCustomer, Mode=TwoWay, 
              UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False">

ViewModel 代码:

public Customer SelectedCustomer
{
    get { return _selectedCustomer; }
    set
    {
        if (value != _selectedCustomer)
        {
            _selectedCustomer = value;
            NotifyOfPropertyChange(() => SelectedCustomer);
        }
    }
}

提前致谢!

【问题讨论】:

  • 您确定您在SelectedCustomer 中设置的CustomerCustomers 孩子之一。请注意SelectedCustomer 必须与Customers 子代之一的引用不是同一客户。 (同一个参考不是客户)这是非常重要的。
  • @MoHaKa 感谢您的评论。我确定他们引用的是同一个客户。
  • 第一次选择后输出窗口中是否出现任何绑定错误?为了清楚起见,您是说 SelectedCustomer 在第一次选择后没有更新,对吗?看起来您可能正在使用 CaliburnMicro 您是否尝试过设置 x:Name="Customers" 并查看 CM 是否可以为您处理绑定?
  • @JasonMassey 没有绑定错误。是的,SelectedCustomer 在第一次选择后没有更新。绑定不是由 CM 处理的,实际上是数据网格绑定到自定义对象列表。

标签: wpf binding datagrid


【解决方案1】:

我已经解决了这个问题,原因是 Customer 的 Equals 方法有拼写错误。

【讨论】:

    【解决方案2】:

    看来您的实施可能略有偏差。通常,您实现 ModelView 以在属性更改后实现更改的“INotifyPropertyChanged”。你绑定到一个可观察的集合,通常你有一个类似于你所拥有的成员列表,但我通常这样做:

    public string Email
            {
                get { return _customer.Email; }
                set
                {
                    if (value == _customer.Email)
                        return;
    
                    _customer.Email = value;
    
                    OnPropertyChanged("Email");  // Text should match property name
                }
            }
    

    在此示例中,_customer 将是设置了自己的属性的 POCO 对象的私有成员。您通常绑定到父集合作为数据源,然后在其成员上实现属性。我也从主要的 MVVM MSDN 示例中得到了这个供参考:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

    我也不确定,但是一旦我通常绑定数据 Itemssource={Binding (collectionName in ModelView)} 我只是列出了该集合成员的文本。 EG:selectitem = "email" 这是集合的一个属性。我通常也使用“可观察集合”数据类型,因为这将实现更改。由于这个原因,我不确定在 MVVM 中是否使用了列表和其他集合。我知道 'readonlycollection' 和 'observablecollection' 是最常见的。

    【讨论】:

    • 谢谢。在我的场景中,SelectedItem 是 Customer 对象而不是它的属性。
    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2012-06-22
    相关资源
    最近更新 更多