कोड में एक बंधन कैसे सेट करें?


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) को अंतिम पंक्ति के स्थान पर इस्तेमाल कर सकते हैं :)
मनीष दुबे

5
@ManishDubey स्थैतिक विधि का लाभ यह है कि पहले पैरामीटर को DependencyObject के रूप में परिभाषित किया जाता है, इसलिए यह उन ऑब्जेक्ट्स पर डेटा बाइंडिंग को सक्षम करता है जो फ्रेमवर्कइलमेंट या फ्रेमवर्ककंटेंटमेंट (जैसे फ्रीज़ेबल्स) से प्राप्त नहीं करते हैं।
१२:०४ पर FreddyFlares

इसके लिए धन्यवाद। इस तरह एक उदाहरण की तलाश में थोड़ा संघर्ष किया
जेसी रॉपर

12

आपको स्रोत को दृश्यमॉडल ऑब्जेक्ट में बदलने की आवश्यकता है:

myBinding.Source = viewModelObject;

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एक स्थानीय संपत्ति के लिए बचाए गए थे और इसका इस्तेमाल व्यूमोडल संपत्तियों तक पहुंचने के लिए किया था। पसंद निश्चित रूप से आपकी है, मुझे यह दृष्टिकोण पसंद है क्योंकि यह बाकी के साथ अधिक सुसंगत है। आप कुछ सत्यापन भी जोड़ सकते हैं, जैसे अशक्त जाँच। यदि आप वास्तव में अपने DataContextआसपास बदलते हैं , तो मुझे लगता है कि कॉल करना भी अच्छा होगा:

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

पुराने दृश्यमॉडल ( e.oldValueईवेंट हैंडलर में) के बंधन को साफ़ करने के लिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.