1

アイテムコントロールにたくさんのテキストブロックがあります...テキストがデータモデルのリストで利用できるかどうかに基づいて、テキストブロック内のテキストに下線を引く方法を知る必要があります..

私には非常に単純に聞こえます...しかし、私は過去8時間からグーグルしています...

この目的で datatriggers と valueconverters を使用できますか? はいの場合、viewModel にあるメソッド (特定のテキストがデータ モデル リストに存在するかどうかを確認するのに役立つメソッド) を実行するにはどうすればよいですか...

条件付きテンプレートを使用する場合でも....モデルにあるリストにアクセスするにはどうすればよいですか (ビューモデルはそれを取得できます...しかし、ビューモデルにアクセスするにはどうすればよいですか?)。

これはかなり簡単なことです...ここで非常に単純なものが本当に欠けていますか?? :)

私は自分のアプリケーションの MVVM パターンに従っています..

4

1 に答える 1

1

1 つの方法は、を実装するクラスである multivalueconverter を使用することIMultiValueConverterです。multivalueconverter を使用すると、複数の値にバインドできます。つまり、viewmodel とTextBlockvalueconverter 内のテキストの両方への参照を取得できます。

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
}

この valueconverter は、 に対して次のように使用できます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>
于 2010-07-05T14:08:40.363 に答える