WPF: условные шаблоны текстового блока - PullRequest
1 голос
/ 05 июля 2010

У меня есть куча текстовых блоков в элементе управления ... Мне нужно знать, как я могу подчеркнуть текст в текстовом блоке в зависимости от того, доступен ли текст в списке в модели данных ..

Звучит очень просто ... но я гуглю с последних 8 часов ...

Могу ли я использовать преобразователи данных и преобразователи значений для этой цели? Если да, то как я могу выполнить метод, который лежит в viewModel (метод, который помогает мне проверить, существует ли данный текст в списке моделей данных) ...

Даже если я использую условные шаблоны .... как мне получить доступ к списку, который лежит в моей модели (модель представления может получить его ... но тогда как мне получить доступ к модели представления?) ..

Это должно быть довольно легко сделать ... Я действительно скучаю по чему-то очень простому здесь ?? :)

Я следую шаблону MVVM для своего приложения.

1 Ответ

1 голос
/ 05 июля 2010

Одним из способов является использование многозначного преобразователя, который представляет собой класс, который реализует IMultiValueConverter.Многозначный преобразователь позволяет вам привязать к нескольким значениям, что означает, что вы можете получить ссылку как на вашу модель представления, так и на текст вашего TextBlock в вашем преобразователе значений.

Предполагая, что ваша модель представления имеет метод с именем GetIsUnderlinedвозвращает true или false, указывая, должен ли быть подчеркнут текст, если ваш преобразователь значений может быть реализован следующим образом:

class UnderlineValueConverter : IMultiValueConverter
{
    #region IMultiValueConverter Members

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var viewmodel = values[0] as Window1ViewModel;
        var text = values[1] as string;
        return viewmodel.GetIsUnderlined(text) ? TextDecorations.Underline : null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter,     System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Вы можете использовать этот преобразователь значения следующим образом для TextBlock:

<Grid x:Name="grid1" >
    <Grid.Resources>
        <local:UnderlineValueConverter x:Key="underlineValueConverter" />
    </Grid.Resources>

    <TextBlock Text="Blahblah">
        <TextBlock.TextDecorations>
            <MultiBinding Converter="{StaticResource underlineValueConverter}">
                <Binding /> <!-- Pass in the DataContext (the viewmodel) as the first parameter -->
                <Binding Path="Text" RelativeSource="{RelativeSource Mode=Self}" /> <!-- Pass in the text of the TextBlock as the second parameter -->
            </MultiBinding>
        </TextBlock.TextDecorations>
    </TextBlock>
</Grid>
...