在 WPF DataGrid 中使用 IValueConverter,具体取决于同一行的多个值

本文关键字:一行 取决于 DataGrid WPF IValueConverter | 更新日期: 2023-09-27 18:34:37

我正在按照MVVM模式开发一个WPF项目。我确实有以下模型:

名称...¦。值。单位。类型.¦.最小值.最大值¦

电压¦.....3.....¦...mV..¦....X....¦...0...¦....5....¦

当前¦.....1...¦...马。。¦....是...2...¦....7....¦

这是数据网格显示的内容:

名称...¦。值。单位。

电压¦....3.....¦.mV..¦

当前¦....1...¦.mA..¦

模板(XAML(:

<DataTemplate x:Key="NumTemplate">
        <wpfToolkit:IntegerUpDown Value="{Binding Value, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource StimVoltageConverter},ConverterParameter=XXX}" />
    </DataTemplate>
    <DataTemplate x:Key="ComboboxTemplate">
        <ComboBox ItemsSource="{Binding Path=XXX}" 
DisplayMemberPath="Name" 
SelectedValuePath="Value" 
SelectedValue="{Binding Value, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>

DataGrid(XAML(:

<DataGrid ItemsSource="{Binding FixParaCollectionView}"  AutoGenerateColumns="False">
    <DataGrid.Columns>
          <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Id}"/>
          <DataGridTemplateColumn Header="Value">
              <DataGridTemplateColumn.CellTemplateSelector>
                  <helper:TemplateSelector ComboboxTemplate="{StaticResource ComboboxTemplate}" NumTemplate="{StaticResource NumTemplate}"/>
              </DataGridTemplateColumn.CellTemplateSelector>
           </DataGridTemplateColumn>
           <DataGridTextColumn Header="Unit" Binding="{Binding Unit,NotifyOnTargetUpdated=True}">
           </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

电压转换器: IV转换器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int val = (int)value;
        return (int)(val / 0.41);
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int val = (int)value;
        return (int)(val * 0.41);
    }

我现在想做两件事:

  1. 根据同一行的另一个值(如"名称"或"类型"(转换值(例如,如果 Type==X,则为 Value*0.41(

  2. 我想验证写入数据网格的值(由用户((例如,验证模型中的最小/最大值(

我在"数字模板"模板中添加了一个转换器。

使用转换器/验证执行此操作是个好主意吗?我真的很想将其实现到转换器中,因为它与所有其他逻辑很好地分开了。

提前谢谢。

在 WPF DataGrid 中使用 IValueConverter,具体取决于同一行的多个值

若要进行验证,需要对属性绑定使用验证功能。

就计算值

而言,如果我有计算值,我通常避免使用依赖项属性。通常更喜欢 INotifyPropertyChanged。 int Value { get { computation...; } set { reverse computation...; PropertyChanged("Value");}}

您可以对依赖项的父值发出属性更改通知,并PropertyChanged(new PropertyChangedArgs("Value"));

事实上,我通常避免在视图模型上使用依赖属性。