【WPF 각서】양방향 데이터 바인딩

4531 단어 XamlC#WPF

소개



마지막 기사 에서 다음과 같이 마무리했지만, 자동적으로 반영되도록 하려면 좀 더 수정이 필요했습니다.

MainViewModel.BindText를 동적으로 변경하면 그에 따라 Label의 Content 속성에도 자동으로 반영됩니다.

XAML



먼저 사용자의 입력 값을 ViewModel에 반영하고 싶으므로 TextBox를 추가합니다.
또한 XAML(UI)의 값이 바인드한 ViewModel에 반영되도록 바인드의 파라미터를 추가합니다.

MainView.xaml
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox x:Name="textBox" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding BindText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AcceptsTab="True" AcceptsReturn="True"/>
    <Label Content="{Binding BindText, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,0,0,0" Grid.Row="1"/>
</Grid>

ViewModel



ViewModel 쪽도 값의 변경을 XAML에 전해 줄 필요가 있습니다.

MainViewModel.cs
using System.ComponentModel;

    :

class MainViewModel : INotifyPropertyChanged
{
    private string _bindText = "てきとうな初期値";
    public String BindText
    {
        get
        {
            return this._bindText;
        }
        set
        {
            this._bindText = value;
            this.OnPropertyChanged(nameof(BindText));

            return;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = null;
    protected void OnPropertyChanged(string info)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }
}


완성



이제 TextBox 변경이 바로 Label에 반영됩니다.
이번 ViewModel에서 추가한 부분은 BaseViewModel 같은 클래스로 분리해 두면, ViewModel이 복수가 되어도 대응하는 것이 간단해진다고 생각합니다.

좋은 웹페이지 즐겨찾기