WPF 데이터 바인딩 요약

최근 며칠 동안 고강도 개발로 적지 않은 문제가 드러났고 WPF는 손에 쥐는 대로 손에 넣을 수 없는 지경에 이르렀으며 많은 것들이 이전의 프로젝트를 보러 가야 한다.평소에 정리를 많이 해야 차원이 높아지면 관심을 가지는 지식이 더욱 깊어진다.다음은 WPF의 귀속과 관련된 내용을 요약하고 정리하기 전에 WPF를 깊이 있게 살펴보고 평소에 사용하던 것과 결합하여 이 글을 얻어낸다(TextBox를 예로 들면 흔히 볼 수 있는 수요를 덮어쓰고 다른 컨트롤러가 유사하며 코드를 다운로드하고 코드를 먼저 보고 해석 효과를 보는 것이 좋다).
이 문서에는 주로 다음과 같은 내용이 포함되어 있습니다.
        1.TextBox는 백그라운드의 값을 귀속합니다. (한 번 귀속은 값을 부여하는 것과 유사합니다.)
        2.TextBox 바인딩 백그라운드의 값(바인딩된 값을 변경하여 자동으로 값을 업데이트할 수 있음);
        3.TextBox는 다른 컨트롤의 속성 값을 바인딩합니다(수시로 값을 업데이트).
        4.TextBox는 다른 컨트롤의 속성 값을 바인딩합니다(양방향 업데이트).
        5.TextBox 바인딩 리소스의 값;
        6.GridView는 정보를 표시할 행을 선택합니다.
        7.기타 주의점

       1.TextBox는 백그라운드의 값을 귀속합니다. (한 번 귀속은 값을 부여하는 것과 유사합니다.)


프런트 디자인 페이지:
<Label>tbDataFirst:</Label>
<TextBlock Name="tbDataFirst" Width="120" TextAlignment="Center"
            Text="{Binding BindData}"></TextBlock>
백그라운드 코드:
private string _BindData = string.Empty;
public string BindData
{
    get
    {
        if (_BindData.Length == 0)
            _BindData = "this is BindData";
        return _BindData;
    }
    set
    {
        _BindData = value;
    }
}
초기화: tbDataFirst.DataContext = this;
프론트 데스크톱은 귀속된 논리를 고정시키고 백엔드는 데이터 원본에 준다. 여기서 백엔드가 귀속된 원본은 현재 대상이고 프론트 데스크톱은 현재 대상의BindData 속성 값을 얻는다.

        2.TextBox 바인딩 백그라운드의 값(바인딩된 값을 변경하여 자동으로 값을 업데이트할 수 있음);

프론트 데스크톱 디자인 페이지:
<Label>tbDataSecond:</Label>
<TextBox Name="tbDataSecond" Width="120"></TextBox>
<Button Click="Button_Click">ChangeTextInfo</Button>
백그라운드 코드:
private string _TextBoxData = string.Empty;
public string TextBoxData
{
    get 
    {
        if (_TextBoxData.Length == 0)
            _TextBoxData = "this is data";
        return _TextBoxData;
    }
    set
    {
        if (_TextBoxData != value)
        {
            _TextBoxData = value;
            OnPropertyChanged("TextBoxData");
        }
    }
}

public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    TextBoxData = DateTime.Now.ToString("HH:mm:ss.fff");
}
바인딩 시 코드:
tbDataSecond.SetBinding(TextBox.TextProperty, 
    new Binding("TextBoxData") { Source = this, Mode = BindingMode.TwoWay });
여기서 주의해야 할 것은 1과 다른 것은 인터페이스의 값을 자동으로 업데이트할 수 있다는 것이다. 이 기능을 실현하려면 원본 대상은INotifyPropertyChanged 인터페이스를 계승하고 속성 값이 바뀔 때 알림 이벤트, 즉 OnPropertyChanged("TextBoxData")를 터치해야 한다.이렇게 하면 TextBoxData 속성 값이 변경될 때마다 인터페이스에서 해당 값을 자동으로 업데이트합니다.

        3.TextBox는 다른 컨트롤의 속성 값을 바인딩합니다(수시로 값을 업데이트).


프런트 디자인 페이지:
<StackPanel Orientation="Horizontal" Margin="5">
    <Label>Input String:</Label>
    <TextBox Name="tbInput" Width="120"></TextBox>
    <Label>Output String:</Label>
    <TextBox Name="tbOutpnput" Width="120" 
                Text="{Binding Text, ElementName=tbInput}"></TextBox>
</StackPanel>
여기는 모두 전단이 실현되고 tbOutpnput은 tbInput 컨트롤러의 텍스트 값을 감시하며 tbInput이 변화하면 tbOutpnput도 따라서 변화한다(그러나 본질은 tbInput 컨트롤러가 tbOutpnput 컨트롤러에 통지하는 것이다).

        4.TextBox는 다른 컨트롤의 속성 값을 바인딩합니다(양방향 업데이트).

프론트 데스크톱 디자인 페이지:
<StackPanel Orientation="Horizontal" Margin="5">
    <Label>TwoWayInput String:</Label>
    <TextBox Name="tbTwoWayInput" Width="120"></TextBox>
    <Label>TwoWayOutpnput String:</Label>
    <TextBox Name="tbTwoWayOutpnput" Width="120" 
                Text="{Binding Text, ElementName=tbTwoWayInput,
                UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>

여기와 3의 차이점은 UpdateSourceTrigger 속성 값을PropertyChanged로 설정하고 TextBox 컨트롤의 기본값은LostFocus이다.

        5.TextBox 바인딩 리소스 파일의 값;


프런트 디자인 페이지:
<Window.Resources>
    <sys:String x:Key="TestInfo">Hello World!</sys:String>
</Window.Resources>
<StackPanel Orientation="Horizontal" Margin="5">
    <Label>Read from resources:</Label>
    <Label Content="{StaticResource TestInfo}"></Label>
</StackPanel>
프론트 데스크톱 페이지의 윈도 이름 공간에 xmlns:sys="clr-namespace:System;assembly=mscorlib"을 추가해야 합니다.

        6.GridView는 정보를 표시할 행을 선택합니다.


이 내용은 주로 GridView와 ComboBox 귀속 데이터 원본(처음 불러올 때 귀속), TextBox와 ComboBox 귀속 GridView의 선택 항목에 대한 상세한 정보를 포함한다.
프런트 디자인 페이지:
<StackPanel Margin="5">
    <ListView x:Name="lvStudent">
        <ListView.View>
            <GridView >
                <GridViewColumn Header="Name" Width="100" 
                                DisplayMemberBinding="{Binding Name}"></GridViewColumn>
                <GridViewColumn Header="Level"  Width="100" 
                                DisplayMemberBinding="{Binding Level.LevelInfo}">
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5">
    <Label>Name:</Label>
    <TextBox Name="tbName" Width="120"
        Text="{Binding Path=SelectedItem,
                        ElementName=lvStudent,
                        Converter={StaticResource ItemToName}}"></TextBox>            
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5">
    <Label>LevelInfo</Label>
    <ComboBox Name="cbLevel" AllowDrop="False" Width="180"
                SelectedIndex="{Binding Path=SelectedItem,ElementName=lvStudent,
                    Converter={StaticResource ItemToIndex}}"></ComboBox>
</StackPanel>

데이터 소스 바인딩:
private void InitDataSource()
{
    lvStudent.ItemsSource = DataProvider.StudentList;
    cbLevel.ItemsSource = DataProvider.LevelList;
    cbLevel.DisplayMemberPath = "LevelInfo";
}
여기 ComboBox 귀속 시 DisplayMemberPath 값을 설정해야 합니다.
TextBox와 ComboBox가 GridView의 선택 항목을 연결할 때 GridView의 선택 항목이 Object이기 때문에 텍스트 드롭다운 상자에서 자동으로 데이터를 얻을 수 없습니다. 사용자 정의 변환 도움말 클래스가 필요합니다. IValueConverter에서 계승됩니다. 구체적인 쓰기 방법은 다음과 같습니다. (SelectItemConverter의 경우)
[ValueConversion(typeof(object), typeof(string))]
public class SelectItemConverter : IValueConverter
{
    public object Convert(object value, Type t, object para, CultureInfo culture)
    {
        Student data = value as Student;
        return data != null ? data.Name : string.Empty;
    }

    public object ConvertBack(object value, Type t, object para, CultureInfo culture)
    {
        return null;
    }
}
선택한 항목을 Student 대상으로 변환한 다음Name 속성 데이터를 얻습니다.ValueConversion 특성을 설정하고 프론트 데스크톱 페이지에 해당하는 명칭 공간을 도입하고 변환 클래스를 표시합니다(원본과 대조하십시오).

         7.기타 주의점

7.1 프런트와 백스테이지가 반복적으로 귀속될 때 이후의 귀속을 위주로 한다(처음에 공부를 시작했을 때 어떤 사람들은 프런트 백스테이지에서 모두 한 번 묶어야 하는데 나중에 그것이 중복된 것임을 알게 된다).
7.2 알림 이벤트를 트리거할 때 값이 변한 후에 트리거하는 것을 주의한다. 즉TextBoxData = value;OnPropertyChanged("TextBoxData");거꾸로 쓰지 마세요. 처음 공부할 때도 만났는데 거꾸로 쓰면 첫 번째 변화치가 반응이 없어요(헤헤, 사실 그때는 조롱박을 보고 바가지를 그렸을 뿐 이해를 못해서 그런 실수를 저질렀어요).
7.3 귀속할 집합도 자동으로 업데이트되면 List 대신 Observable Collection을 사용할 수 있다. 전자는 INotifyPropertyChanged 인터페이스를 실현하고 집합이 변할 때 자동으로 인터페이스를 업데이트한다.
7.4 위의 6은 사실 데이터 구동의 사상이 있기 때문에 구체적으로 여러분은 스스로 배울 수 있습니다.
         
이로써 총결이 완성되면 투철하지 못한 것 같고 깊이 이해하려면 스스로 연구해야 한다.초보자에게 도움이 되었으면 좋겠습니다. 만약 잘못된 생각이나 생각이 있으면 아낌없이 가르쳐 주십시오. 전재는 원문 링크를 보존해 주십시오.
         
원본 다운로드

좋은 웹페이지 즐겨찾기