কোডে একটি বন্ডিং কীভাবে সেট করবেন?


98

আমার কোডে একটি বাইন্ডিং সেট করা দরকার।

আমি ঠিক এটি পেতে পারে না।

এটি আমি চেষ্টা করেছি:

এক্সএএমএল:

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

ভিউমোডেল:

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

সম্পত্তি সেট করার পরে আপডেট হচ্ছে না।

আমি কি ভুল করছি?

উত্তর:


195

প্রতিস্থাপন:

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 )ও ব্যবহার করতে পারেন :)
মণীশ দুবে

6
@ মনিশডুবি স্থির পদ্ধতির সুবিধাটি হ'ল প্রথম প্যারামিটারটি ডিপেন্ডেন্সিঅবজেক্ট হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং এটি ফ্রেমওয়ার্কএলমেন্ট বা ফ্রেমওয়ার্ক কনটেন্টেটমেন্ট (যেমন ফ্রিজ্যাবলস) থেকে প্রাপ্ত নয় এমন বস্তুর উপর ডেটা বাইন্ডিং সক্ষম করে।
ফ্রেডিফ্লেরেস

এর জন্য ধন্যবাদ. এর মতো উদাহরণ খোঁজার জন্য কিছুটা সংগ্রাম করেছিলেন
জেসি রোপার

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ইভেন্ট হ্যান্ডলারে) এর বাঁধাই সাফ করার জন্য ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.