2013-10-08 3 views
0

Я работаю над проектом WPF после шаблона MVVM. У меня есть следующие модели:Использовать IValueConverter в WPF DataGrid в зависимости от нескольких значений одной и той же строки

Название ... |.Value.|.Unit.|.Type.|.Min.|.Max.|

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

Текущий ... ..1 ..... | ... мА..| .... Y .... | ... 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> 

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> 

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); 
    } 

Я хотел бы сделать 2 вещи теперь:

  1. значения Преобразовать (например, Значение * 0,41, если Type == X), на основе другого значения той же строки, например «Имя» или «Тип»

  2. Я хочу проверить значения, записанные в datagrid (пользователем) (например,/max от модели)

Я добавил конвертер в шаблон «NumTemplate».

Это хорошая идея сделать это с помощью конвертера/подтверждения? Я действительно хотел бы реализовать это в конвертере, потому что он прекрасно отделен от всей другой логики.

Заранее спасибо.

ответ

0

Для проверки правильности использования вы хотите использовать свойство validate для привязки свойства.

Что касается рассчитанных значений, я обычно избегаю использования зависимых свойств, если у меня есть рассчитанное значение. Обычно предпочитают INotifyPropertyChanged. int Value { get { computation...; } set { reverse computation...; PropertyChanged("Value");}}

Вы можете иметь PropertyChanged уведомления о родительских значениях зависимого и PropertyChanged(new PropertyChangedArgs("Value"));

В самом деле, я обычно избегаю DependencyProperties на ViewModels.

+0

Как получить другие значения одной строки в ValueConverter? – user2799180