programing

Code에서 바인딩을 설정하는 방법

bestprogram 2023. 4. 17. 22:32

Code에서 바인딩을 설정하는 방법

코드로 바인딩을 설정할 필요가 있습니다.

나는 그것을 제대로 할 수 없을 것 같다.

내가 시도한 것은 다음과 같습니다.

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

뷰 모델:

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

설정해도 속성이 업데이트되지 않습니다.

내가 뭘 잘못하고 있지?

대체:

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(the)Path컨스트럭터 또는 에 의해 설정될 수 있습니다.Path속성).

소스를 뷰 모델 개체로 변경해야 합니다.

myBinding.Source = viewModelObject;

Dippl답변에 더하여, 저는 이것을 Dippl의 내부에 배치하는 것이 좋다고 생각합니다.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이벤트 핸들러).

예:

데이터 컨텍스트:

  class ViewModel
  {
    public string SomeString
    {
      get => someString;
      set 
      {
        someString = value;
        OnPropertyChanged(nameof(SomeString));
      }
    }
  }

바인딩 생성:

  new Binding("SomeString")
  {
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
  };

언급URL : https://stackoverflow.com/questions/7525185/how-to-set-a-binding-in-code