【问题标题】:Update DataGrid cell if other cell changes如果其他单元格更改,则更新 DataGrid 单元格
【发布时间】:2015-08-24 20:09:26
【问题描述】:

我有一个显示零件的视图。所有部分都包含一个标识符列表。在我的视图中,我显示了部件属性和带有该部件所有标识符的 DataGrid。

现在,如果我更改标识符的值,我希望将另一个值更新为默认值。但是,如果我更改我的标识符值并设置其他属性的默认值 - 我的 DataGrid 不会更新。只有当我单击单元格时,它才会在失去焦点后更新。

如何自动更新视图?

我想问题是我不想更新 Part 的直接属性,而是要更新 List 中的 Property,它是 Part 的属性。

查看

<DataGrid>
    <DataGridTemplateColumn Header="Company">
        <DataGridTemplateColumn.CellEditingTemplate>
             <DataTemplate>
                  <ComboBox x:Name="CompanyEditComboBox" 
                            ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Companies}" 
                            SelectedItem="{Binding Company, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                           SelectionChanged = "CompanyEditComboBox_SelectionChanged" />
            </DataTemplate>
         </DataGridTemplateColumn.CellEditingTemplate>
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                 <TextBlock Text="{Binding Company}" />
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
     </DataGridTemplateColumn>


    <DataGridTemplateColumn Header="CompanyType">
         <DataGridTemplateColumn.CellEditingTemplate>
              <DataTemplate>
                    <ComboBox x:Name="CompanyTypeEditComboBox" 
                                      ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.CompanyTypes}" 
                                      SelectedItem="{Binding IdentificationCompanyType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
              </DataTemplate>
          </DataGridTemplateColumn.CellEditingTemplate>
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                 <TextBlock Text="{Binding IdentificationCompanyType, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
</DataGrid>

查看代码隐藏

private void CompanyEditComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var vm = (PartViewModel)DataContext;
    var box = (ComboBox) sender;
    var c = (Company) box.SelectedItem;
    vm.SetDefaultCompanyType(c);
}

视图模型

public void SetDefaultCompanyType(Company c)
{
    SelectedIdentification.IdentificationCompanyType = c.DefaultCompanyType;
    OnPropertyChanged("IdentificationCompanyType");
}

【问题讨论】:

  • 我想在这里理解你的问题,所以当你选择不同的Company 时,它应该在DataGrid 的选定行中选择默认CompanyType
  • 很好,现在如果CompanyType 没有从默认值更改,它将被保存为默认值。如果您只依赖于组合框的实际文本,那么这很容易解决,但如果您需要整个对象,那么您需要设置该组合框的底层SelectedItem,否则当您要保存它时将使用Binding 值.如果这有意义?
  • 出于好奇,为什么不在 IdentificationCompanyType 属性上的 ViewModel 中使用 PropertyChanged 事件处理程序来设置 DefaultCompanyTime 随时更改?当回去调试 WPF 应用程序时,我发现如果我的所有更改逻辑都在一个地方而不是像您在这里那样分散在 UI 中,会更容易。

标签: c# wpf mvvm datagrid


【解决方案1】:

解决了。我必须添加一个

OnPropertyChanged("IdentificationCompanyType");

进入Identification 类中IdentificationCompanyType 的设置器。之后,它会在 DataGrid 中自动更新。

【讨论】:

  • 如果您的问题得到解决,您应该将其标记为已回答。
猜你喜欢
  • 2018-06-09
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多