当前位置: 代码网 > it编程>编程语言>C# > C# WPF编程之元素绑定详解

C# WPF编程之元素绑定详解

2024年05月15日 C# 我要评论
数据绑定是一种关系,该关系告诉wpf从源对象提取一下信息,并用这些信息设置目标对象的属性。目标属性始终是依赖项属性,通常位于wpf元素中,wpf数据绑定的最终目标是在用户界面中显示一下信息。将元素绑定

数据绑定是一种关系,该关系告诉wpf从源对象提取一下信息,并用这些信息设置目标对象的属性。目标属性始终是依赖项属性,通常位于wpf元素中,wpf数据绑定的最终目标是在用户界面中显示一下信息。

将元素绑定到一起

数据绑定的最简单情形是,源对象是wpf元素而且源属性是依赖项属性。依赖项属性具有内置的更改通知支持。当源对象中改变属性值时会立即更新目标对象中的绑定属性。

常用的绑定属性字段:

  • elementname:绑定元素名称
  • path:绑定值
  • mode:绑定模式
  • updatesourcetrigger:绑定更新方式
  • delay:延时时间
<textblock x:name="textfontsize"
           text="{binding elementname=textinput, path=text, mode=twoway, updatesourcetrigger=propertychanged,delay=500}"></textblock>

简单示例,通过slider控制textblock文本字体大小:

    <stackpanel>
        <slider x:name="sliderfontsize" margin="3" minimum="1" maximum="40" value="10"
                tickfrequency="1" tickplacement="topleft"></slider>
        <textblock x:name="textblock" margin="10" text="简单文本内容"
                   fontsize="{binding elementname=sliderfontsize, path=value}"></textblock>
    </stackpanel>

绑定表达式

数据绑定表达式使用xaml标记扩展。因为正在创建system.windows.data.binding类的一个实例,所以绑定表达式以单词binding开头。至少需要设置两个属性:elementname属性(指示源元素)和path属性(指示源元素中的属性)。

如果希望引用附加属性(在另一个类中定义但应用于绑定元素的属性),需要再圆括号中封装属性名称。如,绑定到grid控件中的某个元素,路径(grid.row)将检索放置元素的行号。

绑定错误

wpf不会引发异常来通知与数据绑定相关的问题。如果指定元素或属性不存在,那么不会收到任何指示;

绑定模式

数据绑定的一个特性是目标会被自动更新,而不考虑源的修改方式。

bindingmode枚举值

名称说明
oneway当源属性变化时更新目标属性
twoway当源属性变化时更新目标属性,并且当目标属性变化时更新源属性
onetime最初根据源属性值设置目标属性
onewaytosource与onway类型类似,但方向相反。当目标属性变化时更新源属性
default此类绑定依赖于目标属性。既可以是双向的,也可以是单向的。除非明确指定了另一种模式,否则所有绑定都使用该方法

示例,双向绑定模式:

<stackpanel>
    <slider x:name="sliderfontsize" margin="3" width="500" minimum="1" maximum="40" value="10"
            tickfrequency="1" tickplacement="topleft"></slider>
    <textblock x:name="textblock" margin="10" text="简单文本内容"
               fontsize="{binding elementname=sliderfontsize, path=value, mode=twoway}"></textblock>

    <button x:name="smallbtn" margin="10" width="100" click="smallbtn_click">小字体</button>
    <button x:name="largebtn" margin="10" width="100" click="largebtn_click">大字体</button>
</stackpanel>
private void smallbtn_click(object sender, routedeventargs e)
{
    textblock.fontsize = 15;
}

private void largebtn_click(object sender, routedeventargs e)
{
    textblock.fontsize = 30;
}

代码创建绑定

在构建窗口时,在xaml标记中使用binding标记扩展来声明绑定表达式通常最高效。但也可以使用代码来创建绑定:

示例,代码创建绑定:

binding binding = new binding();
binding.source = sliderfontsize;
binding.path = new propertypath("value");
binding.mode = bindingmode.twoway;
blocktext.setbinding(textblock.fontsize, binding);

移除绑定

可以通过代码使用bindingoperation类的两个静态方法移除绑定。

  • clearbinding()方法:使用依赖项属性的引用作为参数,删除指定的数据绑定;
  • clearallbinding()方法:为元素删除所有数据绑定;

bindingoperation.clearallbinding(blocktext);

需要使用代码绑定的一些特殊情况:

  • 创建动态绑定
  • 删除绑定

使用代码检索绑定

可使用代码检索绑定并检查其属性,而不必考虑绑定最初是用代码还是标记创建的。

获取绑定信息的两种方式:

使用静态方法bindingoperations.getbinding()来检索相应的binding对象。需要提供两个参数:绑定元素以及具有绑定表达式的属性。

<textblock x:name="textblock" margin="10" text="简单文本内容"
               fontsize="{binding elementname=sliderfontsize, path=value"></textblock>
binding binding = bindingoperations.getbinding(textblock, textblock.fontsize);

一旦获取到绑定对象,就可以检查其属性。如:

  • binding.elementname:绑定元素名;
  • binding.path:绑定值;
  • bindingmode:绑定模式;

通过调用bindingoperations.getbindingexpression()方法获得更实用的bindingexpression对象:

bindingexpression expression = bindingoperations.getbingdingexpression(textblock, textblock.fontsize);
    // 获取源元素
    slider boundobj = (slider)expression.resolvedsource;
    
     string bounddata = boundobj.fontsize;

多绑定

可以绑定元素的多个属性。

示例:绑定了 textblock元素的 fontsize,text 和 foreground三个属性

<stackpanel width="500">
    <slider x:name="sliderfontsize" minimum="10" maximum="40" value="20"></slider>
    <textbox x:name="textinput">请输入内容</textbox>
    <listbox x:name="listboxcolor" selectedindex="0">
        <listboxitem foreground="red">red</listboxitem>
        <listboxitem foreground="green">green</listboxitem>
        <listboxitem foreground="blue">blue</listboxitem>
    </listbox>
    <textblock x:name="textshow" margin="5"
               fontsize="{binding elementname=sliderfontsize, path=value}"
               text="{binding elementname=textinput, path=text}"
               foreground="{binding elementname=listboxcolor, path=selecteditem.foreground}"></textblock>
</stackpanel>

绑定更新

绑定数据的更新行为由binding.updatesourcetrigger属性控制,枚举值有:

说明
propertychanged当目标属性发生变化时立即更新源
lostfocus当目标属性发生变化并且目标丢失焦点时更新源
explicit除非调用bindingexpression.updatesource()方法,否则无法更新源
default更加目标属性的元素数据确定更新行为

例如,添加了updatesourcetrigger=propertychanged

<textblock x:name="textfontsize"
           text="{binding elementname=textinput, path=text, mode=twoway, updatesourcetrigger=propertychanged}"></textblock>

绑定延时

下极少数情况下,需要防止数据绑定触发操作和修改源对象,至少需要延迟一段时间。这种情况可以使用binding对象的delay属性。等待数毫秒,之后再提交更改。

例如:添加了delay=500

<textblock x:name="textfontsize"
           text="{binding elementname=textinput, path=text, mode=twoway, updatesourcetrigger=propertychanged,delay=500}"></textblock>

绑定到非元素对象

在数据驱动的应用程序中,更常见的情况是创建从不可见对象中提取数据的绑定表达式。唯一要求是希望显示的信息必须存储在公有属性中。wpf数据绑定基础结构不能获取私有信息或公有字段。

当绑定到非元素对象时,需要放弃binding.elementname属性,并使用以下属性中的一个:

  • source:该属性是指向源对象的引用,也就是提供数据的对象。
  • relativesource:这是引用,使用relatevesource对象指向源对象。有了这个附加层,可在当前元素的基础上构建引用。
  • datacontext:如果没有使用source或relativesource属性指定源,wpf就从当前元素开始在元素树中向上查找。检查每个元素的datacontext属性,并使用第一个非空的datacontext属性。

source属性

source属性非常简单。唯一的问题是为了进行绑定,需要具有数据对象。有多种方法获取数据对象。可从资源中提取数据对象,可通过编写代码生成数据对象,也可在数据提供程序的帮助下获取数据对象。

最简单的选择是将source属性指向一些已经准备好了的静态对象。如,使用来自.net类库的组件:

<textblock text="{binding source={x:static systemfonts.iconfontfamily},path=source}"></textblock>

这个绑定表达式获取由静态属性systemfonts.iconfontfamily提供的fontfamily对象。注意需要借助静态标记扩展static。

绑定到先前作为资源创建的对象。如,标记创建指向calibri字体的fontfamily对象:

<window.resources>
    <fontfamily x:key="customfont">calibri</fontfamily>
</window.resources>

textblock元素会被绑定到该资源:

<textblock text="{binding source={staticresource customfont}, path=source}"></textblock>

relativesource属性

通过relativesource属性可根据相对目标对象的关系指向源对象。例如,可使用relativesource属性将元素绑定到自身或其父元素。relativesource对象使用findancestor模式,该模式告知查找到元素树直到发现ancestortype属性定义的元素类型。

<textblock>
    <textblock.text>
        <binding path="title">
            <binding.relativesource>
                <relativesource mode="findancestor" ancestortype="{x:type window}"/>
            </binding.relativesource>
        </binding>
    </textblock.text>
</textblock>

编写绑定更常用的方法是使用binding和relativesource标记扩展,将其合并到一个字符串种,如下所示:

        <textblock text="{binding path=title, 
            relativesource={relativesource findancestor, ancestortype={x:type window}}}">
        </textblock>    

relativesourcemode 枚举值

名称说明
self表达是绑定到同一元素的另一个属性上
findancestor表达式绑定到父元素
previousdata表达式绑定到数据绑定列表的前一个数据项。在列表元素中会使用到这种模式
templateparent表达式绑定到应用模板的元素。只有当绑定位于控件模板或数据模板内部时,这种模式才能工作

datacontent属性

在某些情况下,会将大量元素绑定到同一个对象。

可使用和设置binding.source属性相同的方法设置元素的datacontext属性。

    <stackpanel datacontext="{x:static systemfonts.iconfontfamily}">
        <textblock text="{binding path=source}"></textblock>
    </stackpanel>

以上就是c# wpf编程之元素绑定详解的详细内容,更多关于wpf元素绑定的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com