プログラムで/動的にスタイルを適用できるように、Silverlight DataGrid の行を ViewModel のある種のスタイル プロパティにバインドすることは可能ですか?
私は Mvvm-Light ツールキットを使用して、mvvm Silverlight アプリを作成することに成功しています。これは、私が遭遇した最初の主要な障害です。
助けてくれてありがとう。
プログラムで/動的にスタイルを適用できるように、Silverlight DataGrid の行を ViewModel のある種のスタイル プロパティにバインドすることは可能ですか?
私は Mvvm-Light ツールキットを使用して、mvvm Silverlight アプリを作成することに成功しています。これは、私が遭遇した最初の主要な障害です。
助けてくれてありがとう。
Silverlightには、データテンプレートセレクターやタイプ固有のデータテンプレートはありません。これを回避する1つの方法は、XAML内の何かの可視性をトリガーするプロパティをViewModelに含めることです。たとえば、DataGridのアイテムテンプレートに、VisibilityがViewModelのIsSelectedなどのプロパティにバインドされている要素を設定し、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>
独自のブール値から可視性への値コンバーターをまだ定義していない場合...
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;
}
}