wpf wpf 绑定附加属性性怎么binding

WPF使用BindingList/ObservableCollection实现数据绑定同步刷新 - 天下第一聪明人 - 推酷
WPF使用BindingList/ObservableCollection实现数据绑定同步刷新 - 天下第一聪明人
& 想必这个问题做过WPF开发的程序员几乎都遇到吧?自从注册了博客园五个月以来,一直都是扮演的浏览者角色。我觉得技术人员应该具有爱分享的品质,同时写博文也是对自己技术的一种锤炼,所以开始总结一些遇到的问题,希望对一些遇到同样难题困扰的朋友们有些帮助或者是启示。这是我发表在博客园的第一篇博文,疏忽纰漏支出还希望大家给予指出。
&Window x:Class=&数据绑定同步刷新.MainWindow&
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
Title=&MainWindow& Height=&350& Width=&525& Loaded=&Window_Loaded_1&&
&ListBox Background=&Transparent& ItemsSource=&{Binding}&
Name=&lbxMarineFiles& Margin=&0,0,179,145&&
&ListBox.ItemTemplate&
&DataTemplate&
&Border Margin=&5,0&&
&StackPanel Orientation=&Horizontal& VerticalAlignment=&Center&&
&Ellipse Stroke=&#C1C1C1&
StrokeThickness=&1&
VerticalAlignment=&Center&
Height=&6&
Fill=&#DDFF82&/&
&TextBlock Text=&{Binding Note}&
VerticalAlignment=&Center&/&
&/StackPanel&
&/DataTemplate&
&/ListBox.ItemTemplate&
&/ListBox&
&Button Content=&Button& HorizontalAlignment=&Left& Margin=&418,80,0,0& VerticalAlignment=&Top& Width=&75& Click=&Button_Click_1&/&
&ListBox HorizontalAlignment=&Right& Height=&140& Margin=&0,180,179,0& ItemsSource=&{Binding}&
Name=&lbxBindList&
VerticalAlignment=&Top& Width=&338&&
&ListBox.ItemTemplate&
&DataTemplate&
&Border Margin=&5,0&&
&StackPanel Orientation=&Horizontal& VerticalAlignment=&Center&&
&Ellipse Stroke=&#C1C1C1&
StrokeThickness=&1&
VerticalAlignment=&Center&
Height=&6&
Fill=&#DDFF82&/&
&TextBlock Text=&{Binding Note}&
VerticalAlignment=&Center&/&
&/StackPanel&
&/DataTemplate&
&/ListBox.ItemTemplate&
&/ListBox&
using System.Collections.G
using System.L
using System.T
using System.Threading.T
using System.W
using System.Windows.C
using System.Windows.D
using System.Windows.D
using System.Windows.I
using System.Windows.M
using System.Windows.Media.I
using System.Windows.N
using System.Windows.S
using ponentM
using System.Collections.ObjectM
namespace 数据绑定同步刷新
/// &summary&
/// MainWindow.xaml 的交互逻辑
/// &/summary&
public partial class MainWindow : Window
ObservableCollection&Notes& liData = new ObservableCollection&Notes&();
BindingList&Notes& biData = new BindingList&Notes&();
public MainWindow()
InitializeComponent();
private void Window_Loaded_1(object sender, RoutedEventArgs e)
liData.Add(new Notes(&id&));
biData.Add(new Notes(&hi&));
this.lbxMarineFiles.ItemsSource = liD
this.lbxBindList.ItemsSource = biD
private void Button_Click_1(object sender, RoutedEventArgs e)
liData.Add(new Notes(&id1&));
biData.Add(new Notes(&hi1&));
public class Notes
private string
public string Note
get { return }
set { note = }
public Notes(String filed)
this.note =
总结:使用BindingList或者ObservableCollection作为数据源时,只需要与Control绑定一次就够了。数据源改变后,界面会同步刷新显示最新数据。原因是它们两个实现了INotifyCollectionChanged接口,具有了本身状态改变时通知客户端的能力。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致3509人阅读
附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上,也就是把对象放入一个特定环境后对象才具有的属性就称为附加属性,附加属性的作用就是将属性与数据类型解耦,让数据类型的设计更加灵活,举例,一个TextBox被放在不同的布局容器中时就会有不同的布局属性,这些属性就是由布局容器为TextBox附加上的,附加属性的本质就是依赖属性,二者仅仅在注册和包装器上有一点区别
小技巧,在VS中输入propa后,连按两次tab键,可以添加好一个附加属性的框架,继续按tab键,可以继续修改附加属性的内容
举个例子,Person这个类,放在学校中就会获得年级这个属性,那么准备一个School类,School类继承DependencyObject,定义一个附加属性
public class School : DependencyObject
public static int GetGrade(DependencyObject obj)
return (int)obj.GetValue(GradeProperty);
public static void SetGrade(DependencyObject obj, int value)
obj.SetValue(GradeProperty, value);
public static readonly DependencyProperty GradeProperty =
DependencyProperty.RegisterAttached(&Grade&, typeof(int), typeof(School), new UIPropertyMetadata(0));
可以看到,附加属性已依赖属性有两点不同:
一。附加属性使用的RegisterAttached方法,而依赖属性使用的是Register方法
二。附加属性使用两个方法进行包装,依赖属性使用CLR属性对GetValue和SetValue两个方法进行包装
如何使用School的GradeProperty呢,首先准备一个DependencyObject的派生类Human
public class Human : DependencyObject
使用这个附加属性
Human human = new Human();
School.SetGrade(human, 6);
MessageBox.Show(School.GetGrade(human).ToString());看看实例代码,如果要在一个3行3列的表格布局的最中间一格放置一个按钮,界面代码如下:
&Window x:Class=&WpfApplication1.MainWindow&
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
Title=&MainWindow& Height=&350& Width=&525&&
&Grid ShowGridLines=&True&&
&Grid.RowDefinitions&
&RowDefinition /&
&RowDefinition /&
&RowDefinition /&
&/Grid.RowDefinitions&
&Grid.ColumnDefinitions&
&ColumnDefinition /&
&ColumnDefinition /&
&ColumnDefinition /&
&/Grid.ColumnDefinitions&
&Button Grid.Row=&1& Grid.Column=&1& Content=&OK& /&
运行后效果如图:
那么,如果用C#代码来实现这个效果,代码如下:
Grid grid = new Grid() { ShowGridLines = true };
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());
grid.RowDefinitions.Add(new RowDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());
grid.ColumnDefinitions.Add(new ColumnDefinition());
Button button = new Button() { Content = &OK& };
Grid.SetRow(button, 1);
Grid.SetColumn(button, 1);
grid.Children.Add(button);
效果与上图一致,附加属性的用法很奇怪吧,附加属性同时也是依赖属性,再附上一个例子,用两个滑块分别控制按钮在九宫格中的位置
&Window x:Class=&WpfApplication1.MainWindow&
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
Title=&MainWindow& Height=&420& Width=&525&&
&StackPanel&
&Grid ShowGridLines=&True& Height=&300&&
&Grid.RowDefinitions&
&RowDefinition /&
&RowDefinition /&
&RowDefinition /&
&/Grid.RowDefinitions&
&Grid.ColumnDefinitions&
&ColumnDefinition /&
&ColumnDefinition /&
&ColumnDefinition /&
&/Grid.ColumnDefinitions&
&Button Content=&OK& Grid.Row=&{Binding ElementName=slider1, Path=Value}& Grid.Column=&{Binding ElementName=slider2, Path=Value}& /&
&Slider x:Name=&slider1& Minimum=&0& Maximum=&2& /&
&Slider x:Name=&slider2& Minimum=&0& Maximum=&2& /&
&/StackPanel&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84378次
积分:1093
积分:1093
排名:千里之外
原创:26篇
(1)(2)(1)(1)(23)(3)依赖属性(Dependency Property)
.NET Framework 3.0引入了一个新的属性类型叫依赖属性, WPF,WF都在使用依赖属性用来实现样式化,数据绑定等.我们更多的使用依赖属性是为了让父元素的属性值在逻辑树上慢慢的传递到其子元素中,从而可以在整个可是父元素的逻辑子元素中共享属性值.WF就是依靠依赖属性来在工作流中的各Activity间传递属性值的. 所以,依赖属性内建的传递变更通知的能力是其最大特征.
如果你想让属性在一个包含内容子控件树的整个逻辑控件树中都有效并共享值时,你仅仅只需要将这个属性声明为依赖属性即可, WPF会通过内建的架构来支持属性的共享. 而在工作流中我们经常需要用到依赖属性,它保证了在一个工作流实例中,多个组件共享了同一个值. 幸运的是在WPF中大部分空间的属性都是依赖属性,这让我们应用时非常方便,而你并不需要着后边发生了什么。
依赖属性的实现
依赖属性其实也是普通的.NET属性,只是通过DependencyProperty.Register方法将普通的.NET属性注册为依赖属性。在依赖属性的声明中,其实对应的普通.NET属性并不是必需的,因为其内部的GetValue和SetValue方法是公开的,依赖属性的使用者可以通过调用GetValue/SetValue而放弃对普通.NET属性的依赖。但建立在普通.NET熟悉之上更符合我们通常的做法,而且这样有利于在XAML中设置属性。
下面的代码展示了定义依赖属性的通常做法:
public class Button:ButtonBase
  //依赖属性
  public static readonly DependencyProperty IsDependencyP
  static Button()
    //注册依赖属性
    Button.IsDependencyProperty = DependencyProperty.Register("IsDefault",
      typeof(bool), typeof(Button),
      new FrameworkPropertyMetadata(false,
      new PropertyChangedCallback(OnIsDefaultChanged)));
  //.NET属性(可选)
  public bool IsDefault
    get { return (bool)GetValue(Button.IsDefaultProperty); }
    set { SetValue(Button.IsDefaultProperty, value); }
  //属性改变时的回调
private static void OnIsDefaultChanged(DependencyObject o,
DependencyPropertyChangedEventArgs e)
在上面的示例代码中是标准的实现依赖属性定义的方法,这里需要注意的是依赖属性始终是定义在普通.NET属性之上的用Register静态方法注册的特殊属性,即便这里的.NET属性(如IsDefault属性)不是必需的。另一个需要注意的地方是,通过声明依赖属性,我们多了一个控制属性改变时的回调方法(即便这同样可以通过声明委托和事件来定义,但这里我们什么都没做,为什么不用呢?),这样的好处是我们可以在属性改变的时候做些我们想做的事情,而我们却省去了手动声明事件的任务。其实回调函数的存在是为了让我们保证在属性包装器中(IsDefault属性)仅仅使用标准的GetValue/SetValue而不用任何其他逻辑,转而将自定义逻辑写入回调函数--这样做是为了遵循WPF的统一设计原则,让XAML 设置属性与使用过程式代码设置属性保持一致。
依赖属性的实现让我们可以在一个局部范围内保持属性值的共享,这样的好处是对于内存的节约,因为GetValue/SetValue内部使用了高效的稀疏存储系统. 前边提到过,依赖属性的一大特征是变更通知,意思就是当某些依赖属性的只改变了,WPF就会更具属性的元数据触发一系列动作.
WPF中有三种方式来实现这样的变更通知:
属性触发器: 在属性发生改变时执行自定义动作,而不用改任何过程代码。
数据触发器: 当普通.NET属性的值改变时调用自定义动作。
事件触发器: 当路由事件被触发时调用自定义动作。
属性触发器(Trigger)
当某个属性有一个特定的值时,属性触发器会执行一个Setter的集合来设置相关对象的属性,而当属性失去这个值的时候,属性触发器会撤消该Setter集合. 这样的好处是大大简化了我们用声明事件的办法来处理满足一定条件时的逻辑,我们在XAML中就可以完成相应的简单逻辑(如果复杂还是需要过程式代码)。
下边的示例显示了旋转变换仅在鼠标移到按钮上方时才会发生,并会设置相应属性。|ZYCWPF| WPF中的MVVM模式,我会Binding控件相应的属性,但是如何Binding控件的Children呢?谢谢
[问题点数:100分,结帖人javamy018]
|ZYCWPF| WPF中的MVVM模式,我会Binding控件相应的属性,但是如何Binding控件的Children呢?谢谢
[问题点数:100分,结帖人javamy018]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年8月 .NET技术大版内专家分月排行榜第三2011年10月 .NET技术大版内专家分月排行榜第三
2013年8月 .NET技术大版内专家分月排行榜第三2011年10月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(5282)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084069',
blogTitle:'WPF Binding',
blogAbstract:'
WPF里分三种Binding:
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 wpf binding 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信