0

私は次の問題のための普遍的な解決策を作るのに苦労しています:

カスタムTreeViewコントロールを想像してみてください。a;;pwsテーマ-TreeViewコントロールの視覚的構造を構築するために使用される別のxamlファイルに要素のリストがあります。表示されるデータの種類に基づいて背景をペイントしたいonmBorder要素があります。この境界線要素は「+」記号の一部であり、スタイルを通して公開されません。

コードビハインドを使用してこれを行うことができ、このコントロールが提供するイベントのいくつかをサブスクライブしてから、子要素でこの境界線を見つけて、その背景を変更します。ただし、このコードは多くのビューで繰り返され、場合によってはまったく同じであり、場合によってはわずかに異なる変更が加えられます(たとえば、異なるデータ要素のみがタイプについてチェックされます)。

他の手法を使用してこれを行う方法はありますか?そのポインアーでは視覚的な構造が構築されていないため、ここではスタイルセレクターを使用できるようです。そのため、この要素を名前で検索することはできません。また、この要素は、コントロールのプロパティを通じて公開されません。

編集:

現在、このコントロールを継承するoqwnコントロールを使用していますが、thaztが見つかった場合は、Attached/depenencyプロパティを使用して実行できます。

public class MyTreeView : CustomTreeView
{
}

行の背景を作成する場合は、スタイルセレクターを作成します。

<local:ProductRowtyleSelector x:Key="productRowStyleSelector"
                              DefaultStyle="{StaticResource defaultProductRowStyle}"
                              GoodStyle="{StaticResource goodProductRowStyle}"
                              ScrapStyle="{StaticResource reworkProductRowStyle}" />

GoodStyleは、コントロールテンプレートに存在する行のスタイルを継承します。このようにして、製品のリストを表示する場所ならどこでもスタイルセレコールを使用します。

コントロールテンプレートに追加したBorder要素に対して同じことを行うのと同様の方法はありますか?

4

1 に答える 1

0

編集

必要なものがあれば、これを試すことができます

次のようなIsTypeOfIValueConverterを作成します。

public class IsTypeOfConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Type parameterType = parameter as Type;
        if (parameterType == null)
            throw new ArgumentException();

        return parameterType.IsAssignableFrom(value.GetType());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

次に、xamlに、DataTriggerを適切なスタイルで配置します

<DataTrigger Binding="{Binding Converter={StaticResource IsKindOfConverter}, ConverterParameter={x:Type Person}}">
    <Setter Property="Backgroud" Value="Red" />
</DataTrigger>
于 2012-10-19T09:00:47.597 に答える