c# - example - WPF에서의 양방향 바인딩




uwp data binding example (2)

나는 약간의 정밀도를 추가 할 필요성을 느낀다 :

"두 가지 방식으로"데이터 바인딩은 "편도"이상의 데이터 바인딩입니다.

"One way"데이터 바인딩은 소스에서 depency 속성으로의 바인딩입니다. 소스는 소스에서 대상으로 변경 전파를 얻으려면 INotifyProertyChanged를 구현해야합니다.

"2 방향"을 얻으려면 대상에서 소스로 전파하려면 바인딩에 설정 한 바인딩 모드에 따라 달라집니다. 바인딩에 대해 BindingMode를 설정하지 않으면 기본 바인딩 모드가 사용되며이 기본 모드는 대상 종속성 속성의 특성입니다.

예:

"MyTextProperty"라는 문자열 속성에 바인딩 된 텍스트 상자입니다. 코드에서 TextBox.Text DependencyProperty를 "MyObject"개체의 "MyTextProperty"에 바인딩합니다.

- "편도"바인딩 : "My TextProperty"의 setter는 이벤트 속성이 변경되어야하며 "MyObject"는 INotifyPropertyChanged를 구현해야합니다.

-> "2 가지 방식의 데이터 바인딩": "편도"에 필요한 것 이외에, bindingMode는 "2 가지 방식"으로 설정되어야합니다. 이 특별한 경우 Textbox의 Text DependencyProperty에는 기본 모드로 "2 가지 방법"이 있으므로 다른 방법은 없습니다.

WPF에서 양방향 바인딩을 사용할 수 없습니다. 내 텍스트 상자에 바인딩 된 내 응용 프로그램의 주 창에서 문자열 속성이 있습니다 ( "TwoWay"모드로 설정). 텍스트 상자의 값이 업데이트되는 유일한 시간은 창이 초기화 될 때입니다. 텍스트 상자에 입력 할 때 기본 문자열 속성 값이 변경되지 않습니다. 문자열 속성의 값이 외부 소스에 의해 변경되면 (예 : 클릭시 이벤트가 텍스트 상자의 값을 다시 설정하는 경우) 변경 내용은 텍스트 상자까지 전파되지 않습니다.

이 거의 사소한 예제에서도 제대로 작동하려면 양방향 바인딩을 구현하기 위해 구현해야하는 단계는 무엇입니까?

(필요한 경우 코드를 제공 할 수 있습니다. 프로세스를 더 찾고 있습니다. 데이터 바인딩의 기본 사항을 이해합니다. WPF가 새로 도입되었습니다.)


대부분의 경우 WPF dependencyProperty (다른 것들과 함께 변경 알림을 제공함) 대신 .net CLR 속성에 바인딩하려고합니다.
일반 CLR 속성의 경우 INotifyPropertyChanged를 구현하고 PropertyChanged 이벤트 핸들러의 텍스트 상자에 강제 업데이트해야합니다.

  • 따라서이 인터페이스를 구현하는 속성으로 개체를 만들고 속성 설정자에서 이벤트를 발생시킵니다. (이제 속성 변경 알림이 있음)
  • 개체가 UI 요소 / 컨트롤의 DataContext 속성으로 설정되어 있는지 확인하십시오.

WPF 데이터 바인딩에 대해 배우기 시작했을 때도이 사실이 저를 버렸습니다.

업데이트 : 글쎄요, OP가 틀린 나무를 짖는다면 시간 낭비 였을 것입니다. 어쨌든 이제는 조금 파야 했으므로 오랜 시간 동안 기억할 것입니다. 이 대답을 반올림하는 코드 스 니펫은 다음과 같습니다. 또한 탭 아웃하자마자 텍스트 상자를 업데이트하자마자 자동으로 업데이트되는 것을 발견했습니다. datacontext 객체가 INotifyPropertyChanged를 구현하는 객체가 아닌 경우 수동으로 이벤트에 가입하고 UI를 업데이트해야합니다.

MyWindow.xaml

<Window x:Class="DataBinding.MyWindow" ...
    Title="MyWindow" Height="300" Width="300">
    <StackPanel x:Name="TopLevelContainer">
        <TextBox x:Name="txtValue"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
        <TextBlock TextWrapping="Wrap">We're twin blue boxes bound to the same property.</TextBlock>
        <TextBox x:Name="txtValue2"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
    </StackPanel>
</Window>

MyWindow.xaml.cs

public partial class MyWindow : Window, INotifyPropertyChanged
{
    public MyWindow()
    {
        InitializeComponent();
        this.MyDotNetProperty = "Go ahead. Change my value.";
        TopLevelContainer.DataContext = this;
    }

    private string m_sValue;
    public string MyDotNetProperty
    {
        get { return m_sValue; }
        set
        {
            m_sValue = value;
            if (null != this.PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyDotNetProperty"));
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}




data-binding