Как динамически установить текст строки жирным шрифтом, используя MVVM, C # и без Code-Behind? - PullRequest
3 голосов
/ 09 января 2012

Я разрабатываю страницу WPF, используя .NET, MVVM, без кода, используя PropertyChanged.На этой странице у меня есть DataGrid с большим количеством столбцов.В БД один из столбцов, назовем его HIGHLIGHT, будет иметь значения S или N. Если значение = S, вся строка будет выделена жирным шрифтом или ExtraBold.Случай N = Нормальный.

Я сделал эту работу, используя этот код в XAML:

        <Style x:Key="TextRowStyle" TargetType="{x:Type TextBlock}" >
        <Style.Triggers>
            <DataTrigger Binding="{Binding Slab.Highlight}" Value="S">
                <Setter Property="FontWeight" Value="ExtraBold"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

Но, делая так, мне придется вставить КАЖДУЮ КОЛОННУ, этот код, чтобы сделатьэто работает (обратите внимание на ElementStyle):

<DataGridTextColumn Header="Test" Binding="{Binding SlabSeq}" ElementStyle="{StaticResource TextRowStyle}"/>

Что мне нужно:

В каждой таблице моей БД есть несколько столбцов, более 60, 70, и я ищу способчтобы сделать это проще, как StaticResource TextRowStyle, который я сделал ...

Еще одна вещь, которую я сделал, это был конвертер:

public class HighlightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (System.Convert.ToChar(value).Equals("S"))
            return FontWeights.ExtraBold;
        else
            return FontWeights.Normal;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return FontWeights.ExtraBold;
    }
}

Я пытался сделатьконвертер внутри этих полей, используя:

<Page.Resources>
    <vm:HighlightConverter x:Key="HighlightConverter"/>
</Page.Resources>

и в сетку:

<TextBlock FontWeight={Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/>

Кто-нибудь знает, как я могу заставить эту работу?

С наилучшими пожеланиями, Густаво.

Ответы [ 3 ]

9 голосов
/ 10 января 2012

почему вы не создаете "локальный" стиль в вашем DataGrid.Resources. я правильно понял, что весь ряд должен быть жирным (S) или нормальным (N)?

<DataGrid.Resources>
  <Style TargetType="{x:Type DataGridCell}" >
     <Setter Property="FontWeight" Value="Normal"/>
     <Style.Triggers>
        <DataTrigger Binding="{Binding Slab.Highlight}" Value="S">
            <Setter Property="FontWeight" Value="ExtraBold"/>
        </DataTrigger>
    </Style.Triggers>
  </Style>
</DataGrid.Resources>

с кодом выше, все ячейки будут нормальными, но если у datarow есть Slab.Highlight = S, все ячейки будут выделены жирным шрифтом. код не проверен. может быть, вам нужно добавить TextBlock.Fontweight или что-то в этом роде.

2 голосов
/ 09 января 2012

Как насчет неявного применения стиля путем отбрасывания x:Key?Это должно сделать его применимым везде в сетке, когда помещено в DataGrid.Resources.

0 голосов
/ 09 января 2012

Это может сработать.Извините, это не проверено, так как я не нахожусь рядом с IDE.

            <DataGrid>
            <DataGrid.Resources>
                <Style TargetType="DataGridTextColumn">
                    <Style.Resources>
                        <Style TargetType="TextBlock">
                            <Setter Property="FontWeight" Value="{Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/> 
                        </Style>
                    </Style.Resources>
                </Style>
            </DataGrid.Resources>
        </DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...