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
'programing' 카테고리의 다른 글
UTF-8 바이트[]를 문자열로 변환하는 방법 (0) | 2023.04.17 |
---|---|
iPhone Simulator에 이미지 또는 비디오 추가 (0) | 2023.04.17 |
메서드의 실행 시간을 밀리초 단위로 정확하게 기록하는 방법 (0) | 2023.04.17 |
개발 브랜치를 마스터와 병합 (0) | 2023.04.17 |
WPF에서 라벨 텍스트를 중앙에 배치하려면 어떻게 해야 합니까? (0) | 2023.04.17 |