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

时间:2013-10-08 15:42:25

标签: c# wpf mvvm datagrid ivalueconverter

我正在研究MVVM模式之后的WPF项目。我有以下模型:

命名... |.Value.|.Unit.|.Type.|.Min.|.Max.|

Voltage| ..... ..... 3 | ... mV..| .... X .... | ... 0 ... | .... 5 ... .|

Current| ..... ..... 1 | ... mA..| .... ....Ý| ... 2 ... | .... 7 ... .|

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

命名... |.Value.|.Unit.|

Voltage| .... 3 ..... |.mV..|

Current| .... 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>

数据网格(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>

StimVoltageConverter:IValueConverter:

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,则为值* 0.41),如“名称”或“类型”

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

  3. 我在“NumTemplate”模板中添加了一个转换器。

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

    提前致谢。

1 个答案:

答案 0 :(得分:0)

要进行验证,您需要在属性绑定上使用验证功能。

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

您可以对相关的父级值PropertyChanged(new PropertyChangedArgs("Value"));

进行propertychanged通知

实际上,我通常会在viewmodels上避免使用DependencyProperties。