2016-05-30 7 views
1

私は四角で表示し、ブール変数に応じて塗りつぶしを特定のブラシに設定します。このため、私はViewModelにDependencyPropertyを追加しました。ビューでビューモデルで依存関係プロパティを使用して矩形の塗りを変更する

public static readonly DependencyProperty FalseColorProperty = DependencyProperty.Register(
      "FalseColor", 
      typeof(Brush), 
      typeof(BooleanRectangleView), 
      new FrameworkPropertyMetadata(Application.Current.FindResource("LightGreyBrush"), FrameworkPropertyMetadataOptions.AffectsRender)); 

public Brush FalseColor 
{ 
    get { return (Brush)GetValue(FalseColorProperty); } 
    set { SetValue(FalseColorProperty, value); } 
} 

、私は私がViewModelにでたDependencyPropertyを持っているので作成するとき、私はそれを設定する方法がわからない、次のトリガ

<DataTrigger Binding="{Binding DataContext.Model.Variable, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="false"> 
         <Setter Property="Fill" Value="{Binding DataContext.FalseColor, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
</DataTrigger> 

で長方形にスタイルを追加しましたUserControl。たとえば、次はまた

<BooleanRectangleView FalseColor="..."/> 

を動作しません、私はプログラムを実行しているとき、私はViewModelにのコンストラクタで例外を取得:

デフォルトのタイプはの型と一致しません(ドイツ語からの翻訳)プロパティFalseColor

EDIT:

私は新しい例外を取得ブラシににfindResourceを唱えたとき:

プロパティFalseColorのデフォルト値は、特定のスレッド

にバインドすることはできません、私はそれがにfindResourceではない何かを持っていると思いますディスパッチャスレッドから必ず呼び出されますか?

+5

DPをViewModelクラスに配置すると、このクラスはDependencyObjectになります。あなたはそれを望んでいません。 INotifyPropertyChangedを発生させるPropertyのみが必要です。あなたはたぶん間違いを犯したでしょう、おそらくViewクラスにあります。問題について:スタイルとDataTriggerにFalseColorを設定する必要があります。デフォルト値の問題:FindResourceをブラシにキャストする必要があります – nkoniishvt

+0

@nkoniishvt:なぜ私はViewModelをDependencyObjectにしたくないのか説明できますか? – gartenriese

+0

依存関係プロパティを持つ理由(通常)は、ビューモデルのプロパティには適用されません。ビューモデルプロパティをバインディングの対象にしたり、スタイル設定ツールで設定したり、アニメーション化したりすることは望ましくありません。 – Clemens

答えて

1

FalseColorPropertyはViewModelレイヤーにありますが、クラスはBooleanRectangleViewと呼ばれ、Viewクラス(UserControlなど)の名前である必要があります。

あなたのビューでは、たとえば、IsVariableTrueという名前のブールに加えて、このDPが表示されます。

ViewModelには、モデルのVariableプロパティにアクセス可能にするVariableプロパティがあります。

あなたはスタイルがありますBooleanRectangleView XAMLで

:あなたのDP宣言で

<BooleanRectangleView IsVariableTrue="{Binding Variable}"/> <!-- Binding to the ViewModel --> 

:あなたのBooleanRectangleViewを使用してXAMLで

<Rectangle> 
    <Rectangle.Style> 
     <Style TargetType="{x:Type Rectangle}"> 
      <Setter Property="Fill" Value="{Binding RelativeSource={RelativeSource Self}, Path=Fill}"/> <!-- Binding to the Rectangle Fill property --> 
      <Style.Triggers> 
       <DataTrigger Property="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type BooleanRectangleView}}, Path=IsVariableTrue}" Value="False"> 
        <Setter Property="Fill" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type BooleanRectangleView}}, Path=FalseColor}"/> <!-- Binding to the DP in the View --> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Rectangle.Style> 
    ... 
</Rectangle> 

public static readonly DependencyProperty FalseColorProperty = DependencyProperty.Register(
    "FalseColor", 
    typeof(Brush), 
    typeof(BooleanRectangleView), 
    new FrameworkPropertyMetadata(
     Brush.Red, 
     FrameworkPropertyMetadataOptions.AffectsRender 
    ) 
); 

public Brush FalseColor 
{ 
    get { return (Brush)GetValue(FalseColorProperty); } 
    set { SetValue(FalseColorProperty, value); } 
} 

あなたはあなたのBooleanRectangleViewのコンストラクタでDP値を設定します:

public BooleanRectangleView() { 

    InitializeComponents(); 
    FalseColor = (Brush)Application.Current.FindResource("Infoteam_LightGreyBrush"); 
} 

もっと良い解決策があるとは思いますが、うまくいくはずです。我々はControlTemplateの中じゃないよう

編集

はRelativeSourceとの結合のためのTemplateBindingのを置き換え。 RectangleにIsVariableTrueが存在しないため、TriggerをDataTriggerに置き換えました。

+0

ちょうどそれを得るために、私はDP宣言をどこに置くのですか?ビューで? – gartenriese

+0

'Value =" {TemplateBinding FalseColor} "で' FalseColorメンバーが有効な型名を持たず、 'メンバーFalseColorが認識されないかアクセスできません 'というエラーが表示されます。 – gartenriese

+0

@gartenrieseとはい、DP宣言はビューのコードビハインドにあるべきである – nkoniishvt

関連する問題