Mvvm Silverlight с использованием привязки к строкам с программным стилем в SilverLight DataGrid

Можно ли связать строки в Silverlight DataGrid с каким-либо свойством стиля в ViewModel, чтобы стили можно было применять программно / динамически?

Я довольно успешно использовал набор инструментов Mvvm-Light для создания приложения mvvm silverlight, это первый серьезный камень преткновения, с которым я столкнулся.

Заранее благодарю за любую помощь.


person bplus    schedule 01.07.2010    source источник


Ответы (1)


В Silverlight нет селектора шаблонов данных или шаблонов данных для конкретных типов. Один из способов обойти это - иметь свойство в вашей ViewModel, которое запускает видимость чего-либо в XAML. Например, имейте элемент в своем шаблоне элемента DataGrid, где видимость привязана к свойству, например 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>

Если вы еще не определили свой собственный преобразователь значений Boolean в Visibility ...

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;
    }
}
person Matt Casto    schedule 02.07.2010