如何触发Dataitemtemplateselectorr属性发生变化时

从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定。因为在此之前有bind(), live(), delegate()等方法来处理事件绑定,jQuery从性能优化以及方式统一方面考虑决定推出新的函数来统一事件绑定方法并且替换掉以前的方法。
on(events,[selector],[data],fn)
$(elements).on( events [, selector] [, data] , handler );
$(elements).off( [ events ] [, selector] [, handler] );
events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" 。
selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代。如果选择器为null或省略,当它到达选定的元素,事件总是触发。
data:当一个事件被触发时要传递event.data给事件处理函数。
fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。
替换bind()
当第二个参数'selector'为null时,on()和bind()其实在用法上基本上没有任何区别了,所以我们可以认为on()只是比bind()多了一个可选的'selector'参数,所以on()可以非常方便的换掉bind()
$('a').bind('click', myHandler);
$('a').on('click', myHandler);
$(window).unbind('scroll.myPlugin');
$(window).off('scroll.myPlugin');
替换live()
在1.4之前相信大家非常喜欢使用live(),因为它可以把事件绑定到当前以及以后添加的元素上面,当然在1.4之后delegate()也可以做类似的事情了。live()的原理很简单,它是通过document进行事件委派的,因此我们也可以使用on()通过将事件绑定到document来达到live()一样的效果。
live()写法
&$('#list li').live('click', '#list li', function() {&&& //function code here.});&
$(document).on('click', '#list li', function() {&&& //function code here.});
这里的关键就是第二个参数'selector'在起作用了。它是一个过滤器的作用,只有被选中元素的后代元素才会触发事件。
替换delegate()delegate()是1.4引入的,目的是通过祖先元素来代理委派后代元素的事件绑定问题,某种程度上和live()优点相似。只不过live()是通过document元素委派,而delegate则可以是任意的祖先节点。使用on()实现代理的写法和delegate()基本一致。
delegate()的写法
$('#list').delegate('li', 'click', function() {&&& //function code here.});
$('#list').on('click', 'li', function() {&&& //function code here.});
貌似第一个和第二个参数的顺序颠倒了一下,别的基本一样。
总结jQuery推出on()的目的有2个,一是为了统一接口,二是为了提高性能,所以从现在开始用on()替换bind(), live(), delegate吧。尤其是不要再用live()了,因为它已经处于不推荐使用列表了,随时会被干掉。如果只绑定一次事件,那接着用one()吧,这个没有变化。推荐使用on() off().
注:jQuery1.9删除了一些在1.8中已经过时的api
jQuery1.9删除了一些在1.8中已经过时的api,想要把那些不够安全的、缺乏效率的、用处不大的,以及带有误导的特性统统去掉。如果你想升级你的jquery版本,但又使用了如下被删除的api的话,可以引入Migrate迁移插件,被删除的api可以在Migrate插件中修复。.toggle(function, function, & )toggle()方法可实现点击一个元素来执行指定函数。此方法被删除以减少混乱和提高潜在的模块化程度。jQuery.browser()jQuery.browser()通过UA信息来检测浏览器。此方法在1.3版本中已不赞成使用,并在1.9版本中被删除,jquery团队更建议通过特性检测来时您的代码兼容浏览器。.live()live()方法可以为未来生成的元素添加事件,此方法在1.7版本中已不赞成使用,并在1.9版本中被删除,您可以使用on()方法来代替。.die()die()方法可以移除live()添加的事件,此方法在1.7版本中已不赞成使用,并在1.9版本中被删除,您可以使用off()方法来代替。.sub()sub()方法可以可创建一个新的jQuery副本,不影响原有的jQuery对像,但用例的数量已经不足以证明它存在的价值。
阅读(...) 评论()wpf 模板选择器DataTemplateSelector及动态绑定使用教程 | 熊窝窝
其实也说不上算是教程了,只是把自己学习的代码拿出来分享一下,同时方便以后遇到类似问题的时候翻一下。
MSDN里如是说:
通常,如果有多个 DataTemplate 可用于同一类型的对象,并且您希望根据每个数据对象的属性提供自己的逻辑来选择要应用的 DataTemplate,则应创建 DataTemplateSelector。请注意,如果具有不同类型的对象,则可以对 DataTemplate 设置 DataType 属性。如果您执行了此操作,则无需创建 DataTemplateSelector。此外,如果对象类型相同但属性不同,也可以考虑使用 DataTrigger 或数据转换器。
通俗讲,就是根据不同的数据选择不同的模板。接下来,我用一个例子来讲述DataTemplateSelector和动态绑定的使用方法。
先看例子的UI:
一个Listbox三个button,listbox显示一个集合的数据,第一个button “change”点击后可以切换与listbox绑定的集合,第二个button给PersonCollection添加person实例,第三个button给AnimalCollection添加animal实例。
默认情况下listbox与PersonCollection绑定,程序启动后,点击Add person按钮会向PersonCollection添加一个person实例,listbox会显示该集合下数据,如果person类的gender属性为Female,则只显示name属性,并把边框改成蓝色。点击change后,listbox与AnimalCollection绑定,显示AnimalCollection数据,同样,Add animal添加animal实例,如果第二个属性不是4,则只显示animal的type属性,并修改边框为蓝色。
下面讲实现
第一步:建两个类,一个person,一个animal,这就是每个listbox item将来要显示的数据。
1234567891011121314151617181920212223242526272829303132333435363738394041424344//person类
& & public class person : INotifyPropertyChanged
& & {
& & & & public event PropertyChangedEventHandler PropertyChanged;
& & & & private string _name;
& & & & public string name
& & & & {
& & & & & & get
& & & & & & {
& & & & & & & & return _name;
& & & & & & }
& & & & & & set
& & & & & & {
& & & & & & & & if (value != _name)
& & & & & & & & {
& & & & & & & & & & _name = value;
& & & & & & & & & & prochanged(&name&);
& & & & & & & & }
& & & & & & }
& & & & }
& & & & private string _gender;
& & & & public string gender
& & & & {
& & & & & & get
& & & & & & {
& & & & & & & & return _gender;
& & & & & & }
& & & & & & set
& & & & & & {
& & & & & & & & if (value != _gender)
& & & & & & & & {
& & & & & & & & & & _gender = value;
& & & & & & & & & & prochanged(&gender&);
& & & & & & & & }
& & & & & & }
& & & & }
& & & & private void prochanged(string info)
& & & & {
& & & & & & if (PropertyChanged != null)
& & & & & & {
& & & & & & & & PropertyChanged(this,
PropertyChangedEventArgs(info));
& & & & & & }
& & & & }
& & }
注意到这里,实现了INotifyPropertyChanged接口,需要引用命名空间ponentModel.因为我希望这些属性改变的时候,listboxitem能自动更新,关于INotifyPropertyChanged接口,请看我另一篇日志。
另一个类,animal与person基本类似,只是把person类里的属性:name和gender改成了type和legs。这里我就不贴代码了。
第二步:创建类DataContainer,包含两个集合,存储animal和person实例。代码:
12345678910& & public class DataContainer
& & {
& & & & public &ObservableCollection&person& PersonCollection { get;set; }
& & & & public &ObservableCollection&animal& AnimalCollection { get; set; }
& & & & public DataContainer()
& & & & {
& & & & & & PersonCollection =
ObservableCollection&person&();
& & & & & & AnimalCollection =
ObservableCollection&animal&();
& & & & }
& & }
我用了ObservableCollection,因为ObservableCollection已经实现了INotifyPropertyChanged接口,所以如果集合的项增删的时候UI会自动更新。(using System.Collections.ObjectM//ObservableCollection)
注意:假设最上面第一段代码person类里面,没有实现INotifyPropertyChanged接口,而这里仍然使用ObservableCollection来存储person列表的话,PersonCollection 里的项增加或删除时,UI的listbox也会相应的增删,但是当你想修改PersonCollection里某一个person实例的属性,比如gender由male变成female时,UI并不会更新,因为PersonCollection 并没变。所以,当你希望改变UI listbox item里某个person的属性时,person类就需要实现INotifyPropertyChanged接口。
第三步:定义数据模板。
当然首先在窗口里把需要的listbox和button放好。我的XAML代码如下:
1234567& & &Grid&
& & & & &ListBox Margin=&12,12,12,60& Name=&listBox1& & HorizontalContentAlignment =&Stretch& ItemTemplateSelector=&{StaticResource mytemplate_selector}&&
& & & & &/ListBox&
& & & & &Button Height=&23& HorizontalAlignment=&Left& Margin=&12,0,0,12& Name=&Change& VerticalAlignment=&Bottom& Width=&75& Click=&Change_Click&&Change&/Button&
& & & & &Button Height=&23& Margin=&120,0,109,12& Name=&addperson& VerticalAlignment=&Bottom& Click=&addperson_Click&&Add person&/Button&
& & & & &Button Height=&23& HorizontalAlignment=&Right& Margin=&0,0,12,12& Name=&addanimal& VerticalAlignment=&Bottom& Width=&75& Click=&addanimal_Click&&Add animal&/Button&
& & &/Grid&
吃饭去了,回来再写……
继续,上面的XAML里的3个button没什么好说的,listbox里,最重要的一句是:ItemTemplateSelector=”{StaticResource mytemplate_selector}”,从字面意思理解,就是把一个叫做mytemplate_selector的静态资源,做为listbox的模板选择器。所以,接下来,定义我们需要资源,包括一个模板选择器和四个数据模板。模板选择器就是这里的mytemplate_selector,四个模板,person和animal各两个,通过模板选择器选择使用哪一个。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253& & &Window.Resources&
& & & & &local:MyDataTemplateSelector x:Key=&mytemplate_selector& /&
& & & & &DataTemplate x:Key =&person_template&&
& & & & & & &Border &Name=&myborder& BorderBrush=&Blue& Padding=&5& Margin=&2& BorderThickness=&1&&
& & & & & & &StackPanel&
& & & & & & & & &TextBlock &Text=&{Binding Path=name}&&&/TextBlock &
& & & & & & & & &TextBlock &Text=&{Binding Path=gender}&&&/TextBlock &
& & & & & & &/StackPanel&
& & & & & & &&/Border&
& & & & & & &DataTemplate.Triggers&
& & & & & & & & &DataTrigger &Value=&Male& Binding=&{Binding Path=gender}&& & & & & &
& & & & & & & & & & &Setter TargetName=&myborder& Property=&BorderBrush& Value=&Red& /&
& & & & & & & & &/DataTrigger&
& & & & & & &/DataTemplate.Triggers&
& & & & &/DataTemplate&
& & & & &DataTemplate x:Key=&male_template&&
& & & & & & &DataTemplate.Resources&
& & & & & & & & &Style TargetType=&TextBlock&&
& & & & & & & & & & &Setter Property=&FontSize& Value=&20& /&
& & & & & & & & &/Style&
& & & & & & &/DataTemplate.Resources&
& & & & & & &Border &Name=&myborder_male& BorderBrush=&Blue& Padding=&5& Margin=&2& BorderThickness=&1&&
& & & & & & & & &DockPanel&
& & & & & & & & & & &TextBlock Text=&{Binding Path=name}&/&
& & & & & & & & &/DockPanel&
& & & & & & &/Border&
& & & & &/DataTemplate&
& & & & &DataTemplate x:Key =&animal_template&&
& & & & & & &Border &Name=&myborder& BorderBrush=&Blue& Padding=&5& Margin=&2& BorderThickness=&1&&
& & & & & & & & &StackPanel&
& & & & & & & & & & &TextBlock &Text=&{Binding Path=type}&&&/TextBlock &
& & & & & & & & & & &TextBlock &Text=&{Binding Path=legs}&&&/TextBlock &
& & & & & & & & &/StackPanel&
& & & & & & &/Border&
& & & & & & &DataTemplate.Triggers&
& & & & & & & & &DataTrigger &Value=&4& Binding=&{Binding Path=legs}&&
& & & & & & & & & & &Setter TargetName=&myborder& Property=&BorderBrush& Value=&Red& /&
& & & & & & & & &/DataTrigger&
& & & & & & &/DataTemplate.Triggers&
& & & & &/DataTemplate&
& & & & &DataTemplate x:Key=&fourlegs_template&&
& & & & & & &DataTemplate.Resources&
& & & & & & & & &Style TargetType=&TextBlock&&
& & & & & & & & & & &Setter Property=&FontSize& Value=&20& /&
& & & & & & & & &/Style&
& & & & & & &/DataTemplate.Resources&
& & & & & & &Border &Name=&myborder_male& BorderBrush=&Blue& Padding=&5& Margin=&2& BorderThickness=&1&&
& & & & & & & & &DockPanel&
& & & & & & & & & & &TextBlock Text=&{Binding Path=type}&/&
& & & & & & & & &/DockPanel&
& & & & & & &/Border&
& & & & &/DataTemplate&
& & &/Window.Resources&
分析前面的XAML,在里面,我们共定义了五个资源,我简单分析一下前三个,后面两个跟第二个、第三个差不多,就不说多了。
第一个资源,定义了一个模板选择器,使用CS文件里的MyDataTemplateSelector类来选择模板。第二个资源,person_template, StackPanel里定义了普通的模板,显示person的name和gender,DataTrigger里定义了一个触发器,当gender为Male的时候,将item的border变成红色。这就是前面UI里不同的边框色的实现关键点。第三个资源male_template,定义了一个Male专用的模板,字体20号,只显示name。person_template模板里,边框颜色的变换通过DataTrigger就能实现,因为要修改的属性是在模板里存在的。但是当你想修改一些模板里不存的属性或者对于gender = male时使用另外完全不同的模板,那就要用到模板选择器了。下面分析前面提到的模板选择器,看着比较多,其实很简单,忍一忍认真点儿看完,你就能有更多收获。
12345678910111213141516171819202122232425262728293031323334353637//必须继承自DataTemplateSelector
&public class MyDataTemplateSelector:DataTemplateSelector
& & {
& & & & //覆盖SelectTemplate函数
& & & & public override DataTemplate SelectTemplate(object item, DependencyObject container)
& & & & {
& & & & & & Window win = Application.Current.MainWindow;
& & & & & & //当前正在显示的是person类数据时:
& & & & & & if (item != null && item
person)
& & & & & & { & & & & & & &
& & & & & & & & person p = item as person;
& & & & & & & & //如果gender是male,将person_template做为现在的模板
& & & & & & & & if (p.gender==&Male&)
& & & & & & & & {
& & & & & & & & & & return win.FindResource(&person_template&) as DataTemplate;
& & & & & & & & }
& & & & & & & & //否则就使用male_template
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & return win.FindResource(&male_template&) as DataTemplate;
& & & & & & & & }
& & & & & & }
& & & & & & else if(item != null && item
animal)
& & & & & & {
& & & & & & & & animal a = item as animal;
& & & & & & & & if (a.legs==4)
& & & & & & & & {
& & & & & & & & & & return win.FindResource(&animal_template&) as DataTemplate;
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & return win.FindResource(&fourlegs_template&) as DataTemplate;
& & & & & & & & }
& & & & & & }
& & & & & & return null;
& & & & }
& & }
程序初初始化的时候:
1234567891011& & & & private bool isPersonDisplaying;
& & & & private DataContainer dc;
& & & & public Window1()
& & & & {
& & & & & & InitializeComponent();
& & & & & & //表示当前正在显示的数据。默认显示person
& & & & & & isPersonDisplaying = true;
& & & & & & dc =
DataContainer();
& & & & & & //指定数据源
& & & & & & listBox1.ItemsSource = dc.PersonCollection;
& & & & }
三个按钮的函数,change:
1234567891011121314151617private void Change_Click(object sender, RoutedEventArgs e)
& & & & {
& & & & & & changeBindingPath();
& & & & }
& & & & private void changeBindingPath()
& & & & {
& & & & & & if (isPersonDisplaying)
& & & & & & {
& & & & & & & & listBox1.ItemsSource = dc.AnimalCollection;
& & & & & & & & isPersonDisplaying = false;
& & & & & & }
& & & & & & else
& & & & & & {
& & & & & & & & listBox1.ItemsSource = dc.PersonCollection;
& & & & & & & & isPersonDisplaying = true;
& & & & & & }
& & & & }
这里实现不同数据源的切换,当数据源变换的时候,WPF会调用前面我们定义的模板选择器,选择正确的模板。
两个增加数据的函数:
12345678910111213141516&private void addperson_Click(object sender, RoutedEventArgs e)
& & & & {
& & & & & & person p =
person();
& & & & & & p.name = &PersonName& + System.DateTime.Now.Second.ToString();
& & & & & & string gender = (System.DateTime.Now.Second%2)==1?&Male&:&Female&;
& & & & & & p.gender = gender;
& & & & & & dc.PersonCollection.Add(p);
& & & & }
& & & & private void addanimal_Click(object sender, RoutedEventArgs e)
& & & & {
& & & & & & animal a =
animal();
& & & & & & a.type = &AnimalType& + System.DateTime.Now.Second.ToString();
& & & & & & a.legs = (System.DateTime.Now.Second % 2) == 1 ? 2 : 4;
& & & & & & dc.AnimalCollection.Add(a);
& & & & }
表达能力一般,水平一般,大家见谅。源代码我打了个包,,编译环境:vs2008。
本条目发布于。属于分类。作者是。
有人回复时邮件通知我
2017年一月 &(2)
2016年七月 &(1)
2016年四月 &(1)
2016年二月 &(1)
2016年一月 &(5)
2015年十一月 &(2)
2015年十月 &(84)
2015年五月 &(2)
2015年四月 &(2)
2015年二月 &(1)
2015年一月 &(2)
2014年十二月 &(4)
2014年十一月 &(3)
2014年十月 &(1)
2014年九月 &(4)
2014年八月 &(1)
2014年四月 &(4)
2014年三月 &(8)
2014年二月 &(1)
2014年一月 &(1)
2013年三月 &(2)
2013年二月 &(2)
2012年十二月 &(2)
2012年十一月 &(2)
2012年九月 &(2)
2012年八月 &(3)
2012年七月 &(3)
2012年六月 &(2)
2012年五月 &(1)
2012年四月 &(2)
2012年二月 &(1)
2012年一月 &(1)
2011年十月 &(1)
2011年八月 &(1)
2011年七月 &(2)
2011年六月 &(14)
2011年五月 &(6)
2011年四月 &(9)
2011年三月 &(2)
2011年一月 &(7)
2010年十二月 &(8)
2010年十一月 &(1)
2010年十月 &(4)
2010年九月 &(1)
2010年八月 &(2)
2010年七月 &(3)
2010年六月 &(10)
2010年五月 &(6)
2010年四月 &(15)
2010年三月 &(17)
2010年二月 &(15)
2010年一月 &(26)
2009年十二月 &(22)
2009年十一月 &(35)
2009年十月 &(18)
2009年九月 &(5)
2009年八月 &(3)
2009年七月 &(1)
2009年六月 &(1)
2009年五月 &(2)
2009年四月 &(7)WPF Template
来源:博客园
ControlTemplate
ControlTemplate:用于定义控件的结构和外观,这样可以将控件外观与控件功能分离开. 在xaml中ControlTemplate通常配置到Style中,通过Style控制控件的结构和外观
如果控件继承自ContentControl类,其模板将包含一个ContentPresenter类成员,ContentPresenter用于指定添加内容的位置,下面是一个Button Style,ContentPresenter的标记表明Button的Content应在Grid内垂直且水平居中显示 ContentPresenter example&Style TargetType="Button"& 
&!--Set to true to not get any properties from the themes.--& 
&Setter Property="OverridesDefaultStyle" Value="True"/& 
&Setter Property="Template"& 
&Setter.Value& 
&ControlTemplate TargetType="Button"& 
&Grid& 
&Ellipse Fill="{TemplateBinding Background}"/& 
&ContentPresenter HorizontalAlignment="Center" 
VerticalAlignment="Center"/& 
&/Grid& 
&/ControlTemplate& 
&/Setter.Value& 
&/Setter& 
&/Style& 
ControlTemplate中也可以添加Trigger,当一个属性发生变化时用于控制一个或者多个属性的变化。如下代码,注意TargetName属性指定了control的名字,满足条件时就会修改该control的属性 
ControlTemplate example&ControlTemplate TargetType="ListBoxItem"& 
&Border Name="ItemBorder" BorderThickness="1" Margin="1" Background="{StaticResource TransparentBrush}"& 
&ContentPresenter /& 
&/Border& 
&ControlTemplate.Triggers& 
&Trigger Property="IsSelected" Value="True"& 
&Setter TargetName="ItemBorder" Property="Background" Value="{StaticResource TransparentBrush}" /& 
&/Trigger& 
&Trigger Property="IsMouseOver" Value="True"& 
&Setter TargetName="ItemBorder" Property="Background" Value="{StaticResource TransparentBrush}" /& 
&/Trigger& 
&/ControlTemplate.Triggers& 
&/ControlTemplate& 
如果控件继承自ItemsControl类,其模板将包含一个ItemsPresenter元素,指示何处放置列表项的模板 
模板绑定:通过使用模板绑定,模板可以从应用模板的控件提取一个值,ContentPresenter之所以能显示Content,就是因为它有一个隐式的模板绑定将ContentPresenter.Content设置为Button.Content,如下代码则设置button content的内边距,如果不把Margin通过TemplateBinding绑定到Padding属性,Button的content 会与侧边重合
TemplateBinding example&ControlTemplate x:key="ButtonTemplate" TargetType="{x:Type Button}"& 
&Border BorderBrush="Orange" BorderThickness="3" CornerRadius="2" 
Background="Red" TextBlock.Foreground="White"& 
&ContentPresenter RecognizeAccessKey="True" 
Margin="{TemplateBinding Padding}"& 
&/ContentPresenter& 
&/Border& 
&/ControlTemplate& 
模板与样式:两者都可以改变control的外观,但样式被限制在一定范围,它不能使用由不同子control组成的可视化数替换control的原有外观,如条目2中的椭圆形按钮,仅使用style无法实现. 
WPF编程宝典中提供的能查看每个control的Template的工具,关键代码如下: 
TemplateBinding exampleprivate void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
Type controlType = typeof(Control); 
List&Type& derivedTypes = new List&Type&(); 
Assembly assembly = Assembly.GetAssembly(typeof(Control)); 
foreach (Type type in assembly.GetTypes()) 
{ 
if (type.IsSubclassOf(controlType) && !type.IsAbstract && type.IsPublic) 
{ 
derivedTypes.Add(type); 
} 
} 
derivedTypes.Sort(delegate(Type x, Type y) 
{ 
return pareTo(y.FullName); 
}); 
lstTypes.ItemsSource = derivedT 
} 
private void lstTypes_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
try 
{ 
Type type = (Type)lstTypes.SelectedI 
ConstructorInfo info = type.GetConstructor(Type.EmptyTypes); 
Control control = (Control)info.Invoke(null); 
control.Visibility = Visibility.C 
grid.Children.Add(control); 
ControlTemplate template = control.T 
XmlWriterSettings setting = new XmlWriterSettings(); 
setting.Indent = true; 
StringBuilder sb = new StringBuilder(); 
XmlWriter writer = XmlWriter.Create(sb, setting); 
System.Windows.Markup.XamlWriter.Save(template, writer); 
txtTemplate.Text= sb.ToString(); 
grid.Children.Remove(control); 
} 
catch (Exception ex) 
{ 
txtTemplate.Text = string.Format("Error generating tempalte:{0}",ex); 
} 
} 


 
DataTemplate


DataTemplate支持对数据的表现形式进行自定义,它可以包含任何元素的组合,还应当包含一个或者多个数据绑定表达式,有两种类型的控件支持: 
内容控件,通过ContentTemplate属性支持数据模板,内容模板用于显示任何放在Content属性中的内容 
列表控件,继承自ItemsControl的控件,通过ItemTemplate属性支持数据模板,用于显示ItemsSource提供的集合中的每个项。也就是该模板会被用作列表中每个项的ContentTemplate模板,如对于ListBox控件,数据模板会作用与ListBoxItem元素,而对于ComboBox则会作用于ComboBoxItem元素 DataTemplate支持使用 DataTemplate.DataType来确定使用模板的绑定数据的类型 
使用下列技术可以使DataTemplate更灵活的表现数据
DataTrigger:可以根据绑定的数据对象中的属性值使用触发器修改模板中的属性 
DataTrigger example&DataTemplate x:Key="DefaultTemplate"&
&DataTemplate.Triggers&
&DataTrigger Binding="{Binding Path=CategoryName}" Value="Tools"&
&Setter Property="ListBoxItem.Foreground" Value="Red"&&/Setter&
&/DataTrigger&
&/DataTemplate.Triggers&
&/DataTemplate&
使用值转换器:实现了IValueConverter接口的类,能够将一个值从绑定的对象转换为可用于设置模板中与格式化相关的属性的值 
IValueConverter example&DataTemplate x:Key="DefaultTemplate"&
&Image Source="{Binding path=imagePath}" Converters="{StaticResource ImagePathConverter}" /&
&/DataTemplate&
使用模板选择器:模板选择器检查绑定的数据对象,并在几个不同的模板之间进行选择。需要继承DataTemplateSelector类,重写SelectTemplate函数。如下代码自定义的SingleHighlightTemplateSelector类包含连个数据模板,并根据属性的值在SelectTemplate函数中选择相应的数据模板
DataTemplateSelector example&ListBox Name="lsProducts" HorizontalContentAlignment="Stretch"& 
&ListBox.ItemTemplateSelector& 
&local:SingleHighlightTemplateSelector 
DefaultTemplate="{StaticResource DefaultTemplate}" 
HighlightTemplate="{StaticResource HighlighTemplate}" 
PropertyoEvaluate="CategoryName" 
PropertyValueToHighlight="Travel"&&/local:SingleHighlightTemplateSelector& 
&/ListBox.ItemTemplateSelector& 
&/ListBox&
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动}

我要回帖

更多关于 jquery selector data 的文章

更多推荐

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

点击添加站长微信