2016-06-20 24 views
0

多くのものが含まれているウィジェットを作成し、UCクラス内から更新されているプロパティ(DependencyProperty)を含んでいます(入力がテキストボックスに入力され、ボタンのクリックなど。)その定義は次のとおりです。UserControlのプロパティへのバインド

public partial class UserControlClassName : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = System.Windows.DependencyProperty.Register("Value", typeof(string), typeof(UserControlClassName), new PropertyMetadata(string.Empty, OnValueChanged)); 

    public string Value 
    { 
     get { return (string)GetValue(ValueProperty); } 
     set 
     { 
      SetValue(ValueProperty, value); 
      NotifyPropertyChanged("Value"); 
     } 
    } 

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue != null && e.NewValue != e.OldValue) 
     { 
      Console.Out.WriteLine("new value: " + e.NewValue); 
     } 
    } 

    ... 
    ... 
    lots of other code that updates the Value property.. 
    ... 
    ... 

} 

次のように私はいくつかのウィンドウのXAMLでUCをインスタンス化しています:

<GeneralControls:UserControlClassName 
      x:Name="someRandomName" 
      Value="{Binding MyViewModel.MyBoundedValueField, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DebugBinding}}" 
      VerticalAlignment="Bottom" /> 

そして絵を完了するためには、これは私はビューモデルのプロパティです値を取得するために使用:

public string MyBoundedValueField 
    { 
     get { return myBoundedValueField; } 
     set 
     { 
      if (myBoundedValueField!= value) 
      { 
       myBoundedValueField = value; 
       OnPropertyChanged("MyBoundedValueField"); 
      } 
     } 
    } 

私の問題は、ユーザーコントロールが更新されますかValueプロパティをIS-が、私は、XAML(myBoundedValueField)内に結合てる外側プロパティが..バインディングで何かを更新を取得されていませんプロパティはそうworking-されていないこの依存関係に私はこれをデバッグするためのコンバータを取り付け、コンバータは

...その間違いなく間違って結合設定して呼び出されません(助けany1にTNX!)

+1

SourceまたはRelativeSourceを設定せずに 'MyViewModel.MyBoundedValueField'のようなバインディングパスには、UserControlのDataContextまたはその親コン​​トロールの1つにパブリック' MyViewModel'プロパティを持つオブジェクトが必要です。それに加えて、INotifyPropertyChangedを実装することは、依存関係プロパティには必要ありません。だから、あなたのコードから多くの冗長なものを削除することができます。 – Clemens

+0

xaml(ウィジェットのように)で提供する入力バインドフィールドに「アタッチ」できるようにするには、ユーザーコントロールが必要です。DataContextを渡す必要がありますか? – Li3ro

+1

あなたは確かに 'MyViewModel'のインスタンスをUserControlのDataContextに渡し、バインディングパスを{Binding MyBoundedValueField、...}に変更する必要があります。 – Clemens

答えて

0

ソリューション最終的にMode = TwoWayを追加することでした。

<GeneralControls:UserControlClassName 
    x:Name="someRandomName" 
    Mode=TwoWay 
    Value="{Binding MyViewModel.MyBoundedValueField, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DebugBinding}}" 
    VerticalAlignment="Bottom" /> 
の 私はそれなしでは動作しませんでしたバインディング理由として知らない

- 私はany1は日陰テーマに関するいくつかの光をすることができた場合の説明を聞くのが大好きだ..

特別@Clemensに感謝!

関連する問題