基于继承类的属性模版中无法绑定的原因和解决方法

这个的晚上想学学WPF 做一个类似于ERP 左边菜单。构思一下思路 。。。。。。

创建一个类基于Expander类。

 1  public class ExpanderBox : Expander
 2     {
 3         #region 定义依赖属性
 4
 5
 6         //定义ItemsSource数据源
 7         public static readonly DependencyProperty ItemsSourcesProperty = DependencyProperty.Register("ItemsSources", typeof(object), typeof(ExpanderBox));
 8         //定义ItemsCommand ,Header头部点击命令。
 9         public static readonly DependencyProperty ItemsCommandProperty = DependencyProperty.Register("ItemsCommand", typeof(ICommand), typeof(ExpanderBox));
10         //定义HeaderHeight,Header头部的高度。
11         public static readonly DependencyProperty HeaderHeightProperty = DependencyProperty.Register("HeaderHeight", typeof(int), typeof(ExpanderBox));
12
13         public object ItemsSources
14         {
15             get { return (object)GetValue(ExpanderBox.ItemsSourcesProperty); }
16             set { SetValue(ExpanderBox.ItemsSourcesProperty, value); }
17         }
18         public ICommand ItemsCommand
19         {
20             get { return (ICommand)GetValue(ExpanderBox.ItemsCommandProperty); }
21             set { SetValue(ExpanderBox.ItemsSourcesProperty, value); }
22         }
23
24         public int HeaderHeight
25         {
26             get { return (int)GetValue(ExpanderBox.HeaderHeightProperty); }
27             set { SetValue(ExpanderBox.HeaderHeightProperty, value); }
28         }
29         #endregion
30
31         //public  ExpanderBox()
32         //{
33         //    HeaderHeight = 10;
34         //}
35
36
37     }

由于 Expander中Content中要放一个ListBox,所以定义了一个依赖属性ItemsSources,HeaderHeight是头部的高度。

后然构造好了,就要写前台的样式了。

 1 <Style TargetType="{x:Type local:ExpanderBox}">
 2         <Setter Property="Template">
 3             <Setter.Value>
 4                 <ControlTemplate TargetType ="local:ExpanderBox">
 5                      <Grid>
 6                         <Grid.RowDefinitions>
 7                             <RowDefinition ></RowDefinition>
 8                             <RowDefinition></RowDefinition>
 9                         </Grid.RowDefinitions>
10                         <ToggleButton Grid.Row="0" Height="{TemplateBinding HeaderHeight}" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Content="{TemplateBinding Header}" Command="{TemplateBinding ItemsCommand}"></ToggleButton>
11                         <ListBox x:Name="itemsBox"  Grid.Row="1" ItemsSource="{TemplateBinding ItemsSources}" Visibility="Collapsed" ></ListBox>
12                     </Grid>
13                     <ControlTemplate.Triggers>
14                         <Trigger Property="Expander.IsExpanded" Value="true">
15                             <Setter Property="Visibility" Value="Visible" TargetName="itemsBox"></Setter>
16                         </Trigger>
17                     </ControlTemplate.Triggers>
18                 </ControlTemplate>
19             </Setter.Value>
20         </Setter>
21     </Style>

从代码框中看到一条有背景色代码,为什么要标出来呢!请不要急,继续看下文

在窗口中定义ExpanderBox

1 <local:ExpanderBox x:Name="ex"   Header="采购合同" HeaderHeight="40"  ItemsSources="{Binding Lists}"></local:ExpanderBox>
2             <local:ExpanderBox x:Name="ex1"  IsExpanded="True"  Header="采购合同" HeaderHeight="{Binding Height}"  ItemsSources="{Binding Lists}"></local:ExpanderBox>

如我所料,运行结果如图!

但是我发现,我无论怎样设置HeaderHeight的值,都无法改变ToggleButton高度。

在网上找了一些资料,很幸运的是在微软网站中找到答案,我就不多写了,直接贴上原文

网址:http://msdn.microsoft.com/zh-cn/library/ms742882.aspx

对于模板方案来说,TemplateBinding 是绑定的优化形式,类似于使用 {Binding RelativeSource={RelativeSource TemplatedParent}} 构造的 Binding。 TemplateBinding 始终为单向绑定,即使所涉及的属性默认为双向绑定。 所涉及的两个属性都必须是依赖项属性。

RelativeSource 是另一个标记扩展,有时与 TemplateBinding 结合使用或者代替它使用,以便在模板中执行相对属性绑定。

此处未介绍控件模板概念;有关详细信息,请参阅 Control 样式和模板

特性语法是最常用于该标记扩展的语法。 在 TemplateBinding 标识符字符串之后提供的字符串标记被指定为基础 TemplateBindingExtension 扩展类的 Property 值。

对象元素语法也可行,但因为没有实际的应用,所以未进行演示。 TemplateBinding 用于使用计算的表达式来填充资源库内的值,因此使用 TemplateBinding 的对象元素语法来填充 <Setter.Property> 属性元素语法就会变得繁冗而多余。

TemplateBinding 还可以在详细特性用法中使用,以便将 Property 属性指定为一个 property=value 对:

看完这句话不能明白上面有两种背景颜色的代码。前面是单向绑定,所以在前台赋值无效,而后者是双向绑定。

总结:

TemplateBinding 是单向绑定形式。

Binding是多向的。

 

以上只是个人想法和实践经验,如果有文字错误和语法错误,请加以指点!

QQ:247039968

emil:[email protected]

无论是美女的歌声,还是鬣狗的狂吠,无论是鳄鱼的眼泪,还是恶狼的嚎叫,都不会使我动摇

时间: 2024-08-12 20:36:56

基于继承类的属性模版中无法绑定的原因和解决方法的相关文章

编程中遇到的Python错误和解决方法汇总整理

这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下 开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习.知识在于积累嘛!微笑+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误: 复制代码代码如下: >>> def f(x, y):      print x, y  >>> t

记一次SpringBoot 开发中所遇到的坑和解决方法

记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型包空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Integer便为null,这时候将Interger自动转型为int,则会出现空指针异常 这个时候,我们可以在Service层对Integer的数据进行判断,如果为空,就把它复制为0 // 在pojo中,如果Integer canJoinNun为null 就把值设置为0 if (publishMsg.getC

Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法

使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 1 ActionContext context = ActionContext.getContext(); 2 ServletContext servletContext = (ServletContext) context.get(ServletActionContext.SERVLET_CONTEXT); //抛空指针异常

node开发指南中的microblog项目中遇到的问题总结及解决方法

1      使用connect-mongdo时,报错:Cannot read property 'Store' of undefined 解决: require('connect-mongo')的时候加一个参数express,如下: var express = require('express'); var MongoStore = require('connect-mongo')(express), 2      使用app.use(express.router(routers)) 提示 h

ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Session,需要对Web Method做如下处理 [WebMethod(EnableSession = true)]public void usingSession(){    Session["Name"] = "Name";} 如果不加EnableSession = tru

jquery中checkbox全选失效的解决方法

这篇文章主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下 如果你使用jQuery 1.6 ,代码if ( $(elem).attr(“checked”) ),将获得一个属性(attribute) ,它不改变该复选框被选中和选中.它只是用来存储默认或选中属性的初始值.为了保持向后兼容,.attr() 方法从 jQuery 1.6.1+ 开始除了返回属性值外,还会更新 property 属性,因此 boolean attribute(布尔属性)不需要通过 .prop(

java新手在实际开发中所遇到的问题及解决方法小结,(持续更新遇到的问题)

?从事开发一年有余,想到自己初入公司时的困窘,在此把我记忆中在实际开发中所遇到的问题做一总结性的小结,为自己以后方便查阅,以及后来者遇到相同问题时解决更加方便快捷,希望大家集思广益把自己遇到的问题及解决方法写出来,添砖加瓦.为后来者给予一点帮助! 实用案例 如何使用Java实现汉诺塔问题 Java中定时器的使用方法 Java打印杨辉三角的具体实现代码 Java中如何实现分页功能 Java读取大文件如何高效率 Java中生成随机数的几种方法 Java zip压缩单个文件实现方法 如何计算Java对

【LaTex】Texstudio中中文文本乱码问题的解决方法

Texstudio中中文文本乱码问题的解决方法:1.因为默认编码是UTF8,ctex的编码是GBK,所以出现乱码.将texstudio编码设成GBK乱码自然消失.2.通过拷贝粘贴,不会出现乱码.3.texstudio构建的编译平台是pdflatex,GBK编码时无需加UTF8选项,加了反而慢,甚至出错.不知为什么?4.编码是UTF8时,宜用xelatex编译,很快.5.Sublimetext可将GBK编码转存为UTF8,转存后用texstudio打开不会出现乱码.如果出现将默认编码改成UTF8就

Windows中openProcess函数返回ERROR_ACCESS_DENIED的解决方法

辛辛苦苦开始了创业,好不容易见到了天使投资人,如何去打动明星投资人?如何能拿到那一笔"救命"钱?看徐小平.雷军这样说. 1. 天使投资人偏爱投什么样的创业者? 雷军:你有强烈的渴望做成一件伟大的事情,并且能让投资者相信你能做得成这件事情.掏自己的钱创业是创业成功率最高的一种,因为在那一瞬间你重视了,你花的每一分钱都是自己的血汗钱和别人的血汗钱,不会轻松把别的投资人的钱打水漂. 曾李青:我们体系内投了好几家公司,发现我们投资成功的公司要么是有做大公司的成功经验,要么是名校毕业.好学校不一