コードでバインディングを設定する方法は?


96

コードでバインディングを設定する必要があります。

私はそれを正しく理解できていないようです。

これは私が試したものです:

XAML:

<TextBox Name="txtText"></TextBox>

コードビハインド:

Binding myBinding = new Binding("SomeString");
myBinding.Source = ViewModel.SomeString;
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(txtText, TextBox.TextProperty, myBinding);

ViewModel:

public string SomeString
    {
      get
      { 
          return someString;
      }
      set 
      { 
          someString= value;
          OnPropertyChanged("SomeString");
      }
    }

プロパティを設定しても更新されません。

何が悪いのですか?

回答:


193

交換:

myBinding.Source = ViewModel.SomeString;

と:

myBinding.Source = ViewModel;

例:

Binding myBinding = new Binding();
myBinding.Source = ViewModel;
myBinding.Path = new PropertyPath("SomeString");
myBinding.Mode = BindingMode.TwoWay;
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(txtText, TextBox.TextProperty, myBinding);

ソースは単なるViewModelである必要があります。.SomeStringパーツはから評価されますPathPathコンストラクタまたはPathプロパティで設定できます)。


14
入力を減らすために最後の行の代わりにtxtText.SetBinding(TextBox.TextProperty、myBinding)を使用することもできます:)
Manish Dubey

5
@ManishDubey静的メソッドの利点は、最初のパラメーターがDependencyObjectとして定義されているため、FrameworkElementまたはFrameworkContentElement(Freezablesなど)から派生していないオブジェクトのデータバインディングが可能になることです。
FreddyFlares 2017

これをありがとう。このような例を探すのに少し苦労しました
Jesse Roper

11

ソースをviewmodelオブジェクトに変更する必要があります:

myBinding.Source = viewModelObject;

1

Dyppl回答に加えて、これをイベント内に配置するとよいと思います。OnDataContextChanged

private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    // Unforunately we cannot bind from the viewmodel to the code behind so easily, the dependency property is not available in XAML. (for some reason).
    // To work around this, we create the binding once we get the viewmodel through the datacontext.
    var newViewModel = e.NewValue as MyViewModel;

    var executablePathBinding = new Binding
    {
        Source = newViewModel,
        Path = new PropertyPath(nameof(newViewModel.ExecutablePath))
    };

    BindingOperations.SetBinding(LayoutRoot, ExecutablePathProperty, executablePathBinding);
}

DataContextローカルプロパティに保存し、それを使用してビューモデルプロパティにアクセスする場合もあります。もちろん、選択はあなた次第です。他の方法との一貫性が高いため、このアプローチが好きです。nullチェックなどの検証を追加することもできます。あなたが実際にあなたのDataContext周りを変えるなら、私はまた電話をするのがいいと思います:

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

e.oldValueイベントハンドラーで)古いビューモデルのバインディングをクリアします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.