Kodda bir bağlama nasıl belirlenir?


100

Kodda bir bağlama ayarlamam gerekiyor.

Bunu doğru anlayamıyorum tho.

Bu denediğim şey:

XAML:

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

Arkasındaki kod:

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

Özellik, ayarladığımda güncellenmiyor.

Neyi yanlış yapıyorum?

Yanıtlar:


197

Değiştirin:

myBinding.Source = ViewModel.SomeString;

ile:

myBinding.Source = ViewModel;

Misal:

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

Kaynağınız sadece ViewModel, .SomeStringparça değerlendirilir Path( Pathyapıcı veya Pathmülk tarafından ayarlanabilir ).


14
Ayrıca yazmayı azaltmak için son satır yerine txtText.SetBinding (TextBox.TextProperty, myBinding) kullanabilirsiniz :)
Manish Dubey

6
@ManishDubey Statik yöntemin faydası, ilk parametrenin bir DependencyObject olarak tanımlanmasıdır, bu nedenle FrameworkElement veya FrameworkContentElement'ten (Freezables gibi) türetilmeyen nesneler üzerinde veri bağlamayı etkinleştirir.
FreddyFlares

Bunun için teşekkürler. Bunun gibi bir örnek ararken biraz mücadele etti
Jesse Roper

12

Viewmodel nesnesi için kaynağı değiştirmeniz gerekir:

myBinding.Source = viewModelObject;

2

Ek olarak cevap ait Dyppl , ben içimdeki bu yerleştirmek için güzel olacağını düşünüyorum OnDataContextChangedolay:

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

Ayrıca, DataContextyerel bir mülke kaydettiğimiz ve bunu viewmodel özelliklerine erişmek için kullandığımız durumlar oldu. Seçim elbette sizindir, bu yaklaşımı seviyorum çünkü diğerleriyle daha tutarlı. Boş kontroller gibi bazı doğrulama da ekleyebilirsiniz. DataContextEtrafınızı gerçekten değiştirirseniz , şunu da aramak güzel olur:

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

eski görünüm modelinin bağlanmasını temizlemek için ( e.oldValueolay işleyicide).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.