2013-10-08 1 views
0

Je travaille sur un projet WPF suivant le modèle MVVM. Je n'ai le modèle suivant:Utilisez IValueConverter dans WPF DataGrid en fonction de plusieurs valeurs de la même ligne

Nom ... |.Value.|.Unit.|.Type.|.Min.|.Max.|

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

Current| ... ..1 ..... | ... mA..| .... Y .... | ... 2 ... | .... 7 .... |

Ceci est ce que le DataGrid montre:

Nom ... |.Value.|.Unit.|

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

Current| .... 1 ..... |.mA..|

Modèles (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); 
    } 

Je voudrais faire 2 choses maintenant:

  1. valeurs Convert (par exemple Valeur * 0.41 si Type == X) basé sur une autre valeur de la même ligne, comme "Nom" ou "Type"

  2. Je souhaite valider les valeurs écrites dans la grille de données (par l'utilisateur) (par exemple valider min/valeur maximale du modèle)

J'ai ajouté un convertisseur au modèle "NumTemplate".

Est-ce une bonne idée de le faire en utilisant un convertisseur/validation? Je voudrais vraiment mettre en œuvre ceci dans un convertisseur parce qu'il est bien séparé de toute autre logique.

Merci d'avance.

Répondre

0

Pour la validation, vous souhaitez utiliser la fonction de validation sur la liaison de propriété.

En ce qui concerne les valeurs calculées, j'évite généralement d'utiliser des propriétés de dépendance si j'ai une valeur calculée. Habituellement, préférant INotifyPropertyChanged. int Value { get { computation...; } set { reverse computation...; PropertyChanged("Value");}}

Vous pouvez avoir une notification PropertyChanged sur les valeurs des parents de la personne à charge, et PropertyChanged(new PropertyChangedArgs("Value"));

En fait, je l'habitude d'éviter DependencyProperties sur viewmodels.

+0

Comment obtenir d'autres valeurs de la même ligne dans ValueConverter? – user2799180

Questions connexes