2017-02-28 37 views
0

スライダコントロールと他のいくつかのコントロールで構成されたカスタムユーザーコントロール(SliderControl.xaml)があります。ユーザーコントロールには、スライダーコントロールのValueプロパティの依存プロパティがあります。WPF依存関係プロパティのバインドが正しく動作しない

public static DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(SliderControl), new PropertyMetadata(50.0)); 

public double Value { 
    get { return (double)GetValue(ValueProperty); } 
    set { SetValue(ValueProperty, (double)value); } 
} 

私は、このように同様のStackPanelの内側に私のカスタムスライダコントロールを使用しているウィンドウを持っている:

<StackPanel> 
    <cl:SliderControl x:Name="valvePosUC" Minimum="0" Maximum="100" Title="Valve Position" Value="50" /> 
</StackPanel> 

これはうまく動作します。値の依存関係プロパティの '50'は、スライダコントロールを50の値に適切に設定しています。

しかし、私がしたいのは、値依存プロパティをビューモデルに公開されているプロパティにバインドすることです私のウィンドウは現在バインドされています。

ここには、自分のウィンドウに設定されているDataContextがあります。

<Window.DataContext> 
    <ViewModel:LRS_1920x1080VM/> 
</Window.DataContext> 

そして、私は価値の依存関係プロパティは、このようなように定義されてバインドしたいと思います私のビューモデル(LRS_1920x1080VM)でプロパティ:

private double _valvePos_SliderValue { get; set; } 
public double ValvePos_SliderValue { 
    get { return _valvePos_SliderValue; } 
    set { 
     _valvePos_SliderValue = value; 
     OnPropertyChanged("ValvePos_SliderValue"); 
    } 
} 

だから、私は何をできるようにしたいと思います

<StackPanel> 
    <cl:SliderControl x:Name="valvePosUC" Minimum="0" Maximum="100" Title="Valve Position" Value="{Binding ValvePos_SliderValue}" /> 
</StackPanel> 

私は、このようなような値依存関係プロパティをバインドしようとすると、しかし、それは動作しません。これは(値は以下の結合に注意してください)です。私の出力に表示されるエラーは、 -

System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'ValvePos_SliderValue'プロパティが 'オブジェクト'に見つかりません 'SliderControl'(Name = 'valvePosUC') ' BindingExpression:Path = ValvePos_SliderValue; DataItem = 'SliderControl'(Name = 'valvePosUC');ターゲット要素は 'SliderControl'(Name = 'valvePosUC')です。プロパティ値が 'Value'(タイプ 'Double')です。 このエラーは、SliderControlのValvePos_SliderValueプロパティがどこにないのかを調べようとしているようです。 ValvePos_SliderValueは、ビューモデルのプロパティです。

+0

は、あなたがどこかに自分自身にSliderControlののDataContextを設定していますか? – mm8

+0

DataContextの問題のほかに、UserControlのValueプロパティへのバインディングが双方向であることも確認する必要があります。明示的にBinding式のModeを設定するか、依存関係プロパティーをBindsTwoWayByDefault'フラグに登録してください。 – Clemens

+0

@クレメンス - ありがとう。私もそれをやるでしょう。 – Jagd

答えて

1

SliderControlDataContextをどこかに設定していますか?

明示的バインディングのソースを指定してみてください:

<cl:SliderControl x:Name="valvePosUC" Minimum="0" Maximum="100" Title="Valve Position" 
       Value="{Binding DataContext.ValvePos_SliderValue, RelativeSource={RelativeSource AncestorType=Window}}" /> 
+0

はい!うわー、私は今それを得る。 SliderControlのヘッダーでは、DataContext自体が設定されています。だから、これを回避し、ビューモデルのプロパティにValue依存関係プロパティをバインドできるようにする方法がありますか? – Jagd

+0

私の回答ごとにRelativeSourceを使ってプロパティのソースを指定しようとしましたか(ちょうどコピーして貼り付けます:)? SliderControlが、ビューモデルクラスのインスタンスにDataContextを設定したウィンドウのビジュアルな子である場合は、これが機能します。 – mm8

+0

それは働いた!以前と同じようなバインディングを試みましたが、 "DataContext"はありませんでした。それで、私はそれが働いていなかった理由だと思います。助けてくれてありがとう!! – Jagd

関連する問題