코드에서 바인딩을 설정하는 방법은 무엇입니까?


96

코드에서 바인딩을 설정해야합니다.

나는 그것을 올바르게 얻을 수없는 것 같다.

이것이 내가 시도한 것입니다.

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

속성을 설정할 때 업데이트되지 않습니다.

내가 뭘 잘못하고 있죠?

답변:


193

바꾸다:

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)을 사용할 수 있습니다
마니 Dubey

5
@ManishDubey 정적 메서드의 이점은 첫 번째 매개 변수가 DependencyObject로 정의되어 FrameworkElement 또는 FrameworkContentElement (예 : Freezables)에서 파생되지 않는 개체에 대한 데이터 바인딩을 활성화한다는 것입니다.
FreddyFlares

감사합니다. 이와 같은 예를 찾기 위해
고군분투


1

받는 사람 또한 대답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로컬 속성에을 저장하고 이를 사용하여 뷰 모델 속성에 액세스하는 경우도있었습니다 . 선택은 물론 당신의 것입니다. 나머지와 더 일관성이 있기 때문에 저는이 접근 방식을 좋아합니다. null 검사와 같은 일부 유효성 검사를 추가 할 수도 있습니다. 실제로 DataContext주위를 바꾸면 다음 과 같이 전화하는 것이 좋습니다.

BindingOperations.ClearBinding(myText, TextBlock.TextProperty);

이전 뷰 모델의 바인딩을 지우려면 ( e.oldValue이벤트 핸들러에서).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.