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>
        注意这里需要在前台页面的Windows命名空间加上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如果要绑定的集合也自动更新可以使用ObservableCollection代替List,前者实现了INotifyPropertyChanged接口,在集合变化时会自动更新界面;
        7.4上面的6其实在有数据驱动的思想,具体各位可以自行学习;
         
         至此总结完成,感觉讲的不够透彻,深入理解还需自己研究。希望能对初学者有些帮助,如果有什么错误或想法,还望不吝指教,转载请保留 原文链接
          源码下载
  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WPF的DataGridComboBoxColumn是一种用于数据网格控件的列类型,它可以显示ComboBox下拉列表,并且可以使用Converter将不同的数据进行绑定。 Converter是WPF中的一个重要概念,它可以在数据绑定过程中进行值的转换。使用Converter可以帮助我们在绑定ComboBox时,将不同的数据进行转换和展示。 使用Converter绑定不同数据的步骤如下: 1. 首先,我们需要创建一个实现了IValueConverter接口的Converter类。这个Converter类负责将源数据转换为目标数据。例如,我们可以将一个int类型的数据转换为对应的字符串类型数据。 2. 接下来,在XAML文件中创建DataGridComboBoxColumn列,并设置Binding属性为对应的数据源。可以使用ItemsSource属性来绑定ComboBox的数据源,可以使用SelectedItemBinding属性来绑定选中的项。同时,使用Converter属性将Converter类与该列的数据绑定进行关联。 3. 在Converter类中,实现Convert方法和ConvertBack方法。Convert方法用于将源数据转换为目标数据,而ConvertBack方法则用于将目标数据转换回源数据。 通过上述步骤,我们就可以实现在DataGridComboBoxColumn列中使用Converter绑定不同的数据总结起来,WPF的DataGridComboBoxColumn通过使用Converter可以实现将不同的数据进行绑定和展示。使用Converter可以将源数据转换为目标数据,从而实现ComboBox的数据绑定数据项的转换。通过掌握这种使用方式,我们可以更灵活地使用DataGridComboBoxColumn列,并展示不同类型的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值