Як встановити прив'язку в коді?


97

Мені потрібно встановити прив'язку в коді.

Здається, я не можу це правильно зрозуміти.

Це те, що я спробував:

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");
      }
    }

Властивість не оновлюється, коли я його встановлюю.

Що я роблю не так?

Відповіді:


194

Замінити:

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частина обчислюється з Path( Pathможе встановити конструктор або Pathвластивість).


14
Ви також можете використовувати txtText.SetBinding (TextBox.TextProperty, myBinding) замість останнього рядка лише для зменшення набору тексту :)
Manish Dubey,

5
@ManishDubey Перевага статичного методу полягає в тому, що перший параметр визначається як DependencyObject, тому він забезпечує прив'язку даних до об'єктів, які не походять від FrameworkElement або FrameworkContentElement (наприклад, Freezables).
FreddyFlares

Дякую за це. Трохи боровся, шукаючи такий приклад
Джессі Ропер,


2

На додаток до відповіді на 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локальну властивість і використовували його для доступу до властивостей viewmodel. Вибір, звичайно, за вами, мені подобається такий підхід, оскільки він більше відповідає решті. Ви також можете додати деякі перевірки, такі як перевірка нуля. Якщо ви насправді змінили своє життя DataContext, я думаю, було б непогано також зателефонувати:

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

щоб очистити прив’язку старої моделі перегляду ( e.oldValueу обробнику подій).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.