WPF:文本块的条件模板

时间:2010-07-05 09:28:10

标签: wpf templates mvvm datatrigger

我在itemscontrol中有一堆文本块...我需要知道如何根据文本是否在数据模型的列表中可用来为文本块中的文本加下划线。

对我来说听起来很简单......但是自从过去8小时以来我一直在谷歌搜索...

我可以为此目的使用数据触发器和值转换器吗?如果是,那么我该如何执行viewModel中的方法(这个方法可以帮助我检查数据模型列表中是否存在给定文本)...

即使我使用条件模板....我如何访问模型中的列表(viewmodel可以获取它...但是我如何访问viewmodel?)..

这应该是一件相当容易的事情......我真的错过了一些非常简单的事吗? :)

我正在遵循我的应用程序的MVVM模式..

1 个答案:

答案 0 :(得分:1)

一种方法是使用多值转换器,它是一个实现IMultiValueConverter的类。多值转换器允许您绑定到多个值,这意味着您可以在您的valueconverter中获得对您的viewmodel和TextBlock文本的引用。

假设您的viewmodel有一个名为GetIsUnderlined的方法,该方法返回true或false,指示文本是否应加下划线,您的valueconverter可以按以下方式实现:

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>