WPF的Binding学习笔记(二)

简介: 上次学了点点Binding的皮毛, 然后就做别的事去了, 等回头再来看WPF的时候, 哈忘记了~ 于是写个例子补一下, 在继续学习Binding. 1, 首先准备好一个类 public class Hero {   public Hero(int id, string name, string skill, bool hasM)   {     this.

上次学了点点Binding的皮毛, 然后就做别的事去了, 等回头再来看WPF的时候, 哈忘记了~

于是写个例子补一下, 在继续学习Binding.

1, 首先准备好一个类

public class Hero
{
  public Hero(int id, string name, string skill, bool hasM)
  {
    this.Name = name;
    this.Id = id;
    this.Skill = skill;
    this.HasM = hasM;
  }   
public int Id { get; set; }   public string Name { get; set; }   public string Skill { get; set; }   public bool HasM { get; set; } }

2, 在MainWindow中准备好数据

Dictionary<string, Hero> map = new Dictionary<string, Hero>();

private void InitDictionary()
{
    Hero hero1 = new Hero(1, "刘备", "哭泣", true);
    map.Add(hero1.Name, hero1);
    Hero hero2 = new Hero(2, "官羽", "贪污", false);
    map.Add(hero2.Name, hero2);
    Hero hero3 = new Hero(3, "黄忠", "射击", true);
    map.Add(hero3.Name, hero3);
    Hero hero4 = new Hero(4, "魏延", "突击", true);
    map.Add(hero4.Name, hero4);
    Hero hero5 = new Hero(5, "马超", "单挑", false);
    map.Add(hero5.Name, hero5);
    Hero hero6 = new Hero(6, "曹仁", "防守", true);
    map.Add(hero6.Name, hero6);
}

 

然后XAML这边是这样的

1, 先准备好template

<Window.Resources>        
    <DataTemplate x:Key="nameDT">
        <TextBlock x:Name="textBoxName" Text="{Binding Name}" />
    </DataTemplate>
    <DataTemplate x:Key="skillDT">
        <TextBlock x:Name="textBoxSkill" Text="{Binding Skill}" />
    </DataTemplate>
    <DataTemplate x:Key="hmDT">
        <CheckBox x:Name="checkBoxJob" IsChecked="{Binding HasM}" />
    </DataTemplate>
</Window.Resources>

2, 界面

<Grid Margin="5" >
    <ListView x:Name="listViewStudent">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" />
                <GridViewColumn Header="姓名" CellTemplate="{StaticResource nameDT}" />
                <GridViewColumn Header="技术" CellTemplate="{StaticResource skillDT}" />
                <GridViewColumn Header="已婚" CellTemplate="{StaticResource hmDT}" />
            </GridView>
        </ListView.View>
    </ListView> 
</Grid>

3, 就是上一篇笔记中记载的Binding方法了

public Window1()
{
    InitializeComponent();
    InitDictionary();
    Binding binding = new Binding();
    binding.Source = map;
    binding.Path = new PropertyPath("Values");
    listViewStudent.SetBinding(ListView.ItemsSourceProperty, binding);
}

好了, 运行!一切OK~

界面出来啦

等等! 好像和上次有点不太一样, 少了一步吧? 数据源没有实现INotifyPropertyChanged接口呢.

先不急, 测试下:

1, 加个button吧, XAML处的界面显示相关代码修改如下

<Grid Margin="5" >
    <Grid.RowDefinitions>
        <RowDefinition Height="3*" />
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <ListView x:Name="listViewStudent">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" />
                <GridViewColumn Header="姓名" CellTemplate="{StaticResource nameDT}" />
                <GridViewColumn Header="技术" CellTemplate="{StaticResource skillDT}" />
                <GridViewColumn Header="已婚" CellTemplate="{StaticResource hjM}" />
            </GridView>
        </ListView.View>
    </ListView> 
    <Button Grid.Row="1" Content="给官老爷正名!" Click="Button_Click" />
</Grid>

2, 填函数

private void Button_Click(object sender, RoutedEventArgs e)
{
    map["官羽"].Name = "关羽";
    map["官羽"].Skill = "单挑";
}

F5运行, 点击按钮, 发现没有得到预期的改变, 表格显示的数据动也不动. 好吧, 看来的确没有Binding, 只是单次的赋值而已, 没有"数据驱动"呀!

那么来补上准备数据源这一步

修改后的Hero类代码如下, 为了便于比较, 实现了Skill, 而不实现Name等其他属性.

public class Hero : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;//请注意

    public Hero(int id, string name, string skill, bool hasJob)
    {
        this.Name = name;
        this.Id = id;
        this.Skill = skill;
        this.HasM = hasM;
    }
    public int Id { get; set; }
    public string Name { get; set; }
   public bool HasM { get; set; }
private string skill; public string Skill { get { return skill; } set { skill = value; //触发事件//请注意 if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Skill")); } } } }

好了, F5运行, 效果如下

嗯, 效果实现, Skill的确是变了, Name没变.

Binding学习笔记一的复习到此结束, 可以看新内容了~

 

啊! !  刚才的Binding有点意思呢, 我不那么写Binding, 而是改成

public Window1()
{
    InitializeComponent();
    InitDictionary();
   // Binding binding = new Binding();
   // binding.Source = map;
   // binding.Path = new PropertyPath("Values");
   // listViewStudent.SetBinding(ListView.ItemsSourceProperty, binding);
listViewStudent.ItemsSource=map.Values;
}

效果竟然一样! ! ! 这个可比textBox.Text的赋值智能多了呀...

 

 

 

目录
相关文章
|
C#
WPF中Binding使用StringFormat格式化字符串方法
原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 // $123.46 货币格式,一位小数 // $123.5 前文字 //单价:$123.
2327 0
|
存储 自然语言处理 C#
WPF技术之Binding
WPF(Windows Presentation Foundation)是微软推出的一种用于创建应用程序用户界面的框架。Binding(绑定)是WPF中的一个重要概念,它用于在界面元素和数据源之间建立关联。通过Binding,可以将界面元素(如文本框、标签、列表等)与数据源(如对象、集合、属性等)进行绑定,从而实现数据的双向传递和同步更新。
306 2
WPF技术之Binding
|
8月前
|
C#
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
332 1
halcon联合c#、WPF学习笔记三(dispatcherTimer实时相机显示)
|
8月前
|
C# C++
halcon联合c#、WPF学习笔记一(WPF配置halcon)
halcon联合c#、WPF学习笔记一(WPF配置halcon)
424 1
|
8月前
|
C#
halcon联合c#、WPF学习笔记二(简单案例)
halcon联合c#、WPF学习笔记二(简单案例)
469 0
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
266 0
|
算法 程序员 C#
【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl] 因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来说可算是相当有难度了,首先我是个Java Web开发程序员,从来没正经地学过微软的开发语言和工具;其次,对于算法这种东西,向来有种天生的排斥,一看便头疼。
1799 0
|
C#
解答WPF中ComboBox SelectedItem Binding不上的Bug
原文:解答WPF中ComboBox SelectedItem Binding不上的Bug 正在做一个打印机列表,从中选择一个打印机(System.Printing) var printServer = new LocalPrintServer(); PrintQueues = printServer.
1025 0
|
C#
WPF Binding Mode,UpdateSourceTrigger
原文:WPF Binding Mode,UpdateSourceTrigger WPF 绑定模式(mode) 枚举值有5个1:OneWay(源变就更新目标属性)2:TwoWay(源变就更新目标并且目标变就更新源)3:OneTime(只根据源来设置目标,以后都不会变)4:OneWayToSource...
1575 0