【问题标题】:WPF SelectedItem not working in MVVMWPF SelectedItem 在 MVVM 中不起作用
【发布时间】:2011-02-21 08:30:55
【问题描述】:

我正在尝试显示两个用外键链接的 sql ce 3.5 sp1 数据库表中的数据 - 客户和订单。在 datadrig 中选择客户时,我希望在另一个网格中填充订单。 我正在使用查询:

var profiles = from c in db.Customers.Include("Orders")
                           select c;

在我的 ViewModel 中:

private Models.Customers _selecteditem;
        public Models.Customers SelectedItem
        {
            get { return _selecteditem; }

        }

视图如下所示:

<Grid>
        <toolkit:DataGrid  x:Name="dg1" ItemsSource="{Binding Customers}" SelectedItem="{Binding SelectedItem, mode=TwoWay}">
            </toolkit:DataGrid>
        <toolkit:DataGrid  x:Name="dg2" ItemsSource="{Binding Path=SelectedItem.Orders}">
        </toolkit:DataGrid>
    </Grid>

我得到的错误是:

Warning 1   Field 'Clients.ViewModels.CustomerViewModel._selecteditem' is never assigned to, and will always have its default value null    

如何让它正常工作?当我只想显示客户时,没关系。 感谢您的任何建议。

【问题讨论】:

    标签: wpf datagrid mvvm selecteditem


    【解决方案1】:

    如果 Martin 的回答没有帮助,请查看 DataGrid.SelectionUnit 并确保将其设置为“FullRow”而不是像我这样设置为“CellOrRowHeader”。

    如果您将其设置为“CellOrRowHeader”,则第一次单击单元格会将 SelectedItem 设置为 null。 我想我会添加这个以防其他人遇到同样烦人的问题。

    【讨论】:

      【解决方案2】:

      您需要一个用于 SelectedItem 的设置器

      private Models.Customers _selecteditem;
      public Models.Customers SelectedItem
      {
          get { return _selecteditem; }
          set { _selectedItem = value; }
      }
      

      此外,由于您在绑定中使用它,因此您希望 ViewModel 实现 INotifyPropertyChanged,因此它实际上是:

      private Models.Customers _selecteditem;
      public Models.Customers SelectedItem
      {
          get { return _selecteditem; }
          set
          { 
            if (_selectedItem != value)
            {
              _selectedItem = value;
              NotifyPropertyChanged("SelectedItem");
            }
          }
      }
      
      public event PropertyChangedEventHandler PropertyChanged;
      
      private void NotifyPropertyChanged(String info)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(info));
          }
      }
      

      【讨论】:

      • 根据你上面写的修改代码后,两个数据网格都没有显示任何数据。
      • @EVA 如果您现在重新发布您的代码,我可以看到您缺少什么。我给您的代码只是为您指明正确方向的示例,可能无法按原样工作。查看 INotifyPropertyChanged 和 WPF Binding 以了解为什么代码是这样编写的,您应该能够根据您的用例进行调整。
      • @MartinHarris :你好马丁,我也面临着类似的问题,请你看看我的问题并指导我哪里出错了?谢谢。 stackoverflow.com/questions/14816687/…
      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2012-06-19
      • 2011-11-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多