2010-07-01 3 views
1

Est-il possible de lier une ligne dans un DataGrid Silverlight à une sorte de propriété de style dans un ViewModel afin que les styles puissent être appliqués par programmation/dynamiquement? J'ai utilisé la boîte à outils Mvvm-Light assez bien pour créer une application mvvm silverlight, c'est la première pierre d'achoppement majeure que j'ai rencontrée.Mvvm Silverlight, utilisant la liaison aux lignes de style par programmation dans un DataGrid SilverLight

Merci d'avance pour toute aide.

Répondre

0

Il n'existe pas de sélecteur de modèle de données ou de modèle de données spécifique au type dans Silverlight. Une façon de contourner ce problème est d'avoir une propriété dans votre ViewModel qui déclenche la visibilité de quelque chose dans le XAML. Par exemple, ayez un élément dans votre modèle d'élément DataGrid où la visibilité est liée à une propriété comme IsSelected dans votre ViewModel et utilisez un convertisseur de valeur BooleanToVisibility.

<DataTemplate> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="130" /> 
      <ColumnDefinition Width="70" /> 
      <ColumnDefinition Width="70" /> 
      <ColumnDefinition Width="50" /> 
     </Grid.ColumnDefinitions> 

     <Grid Grid.ColumnSpan="4" 
       Visibility="{Binding Path=IsSelected, Converter={StaticResource BoolToVisibilityConverter}}"> 
      <Border Style="{StaticResource SelectedDataGridRowStyle}" /> 
     </Grid> 
     <!-- other stuff here --> 
    </Grid> 
</DataTemplate> 

Si vous n'avez pas défini votre propre booléenne convertisseur de valeur visbility encore ...

public class BoolToVisibilityConverter : System.Windows.Data.IValueConverter 
{ 
    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var visible = true; 
     if (value != null && value is bool) 
      visible = (bool)value; 

     var reverse = false; 
     if (parameter != null) 
      reverse = System.Boolean.Parse((string)parameter); 

     visible = reverse ? !visible : visible; 

     return visible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var visibility = System.Windows.Visibility.Visible; 
     if (value != null && value is System.Windows.Visibility) 
      visibility = (System.Windows.Visibility)value; 

     var reverse = false; 
     if (parameter != null && parameter is bool) 
      reverse = (bool)parameter; 

     var visible = visibility == System.Windows.Visibility.Visible; 

     visible = reverse ? !visible : visible; 

     return visible; 
    } 
} 
+0

Cest génial! merci d'avoir pris le temps d'écrire ça. – bplus

Questions connexes