Binding的Path(路径)
Binding的源可以是控件(一个控件是另一个控件的Source、控件把自己的容器作为Source),把集合作为ItemsControls的Source,把xml作为Tree或者Menu的Source,或者是不给它Source,让他自己去找。
- 一个控件为另一个控件的Source
<TextBox x:Name="textBox" Text="{Binding Value,ElementName=slider1}" BorderBrush="Black" Margin="5"/> <Slider x:Name="slider1" Maximum="100" Minimum="0" Margin="5"/>
这是两个控件Slider是TextBox的Source
这里是通过xaml语言设置的Binding,这里是Binding的标记扩展语法。等价于的C#语句为
this.textBox1.SetBinding(TextBox.TextProperty,new Binding("Value"){ElementName="Slider1"});
(Text等价于TextBox.TextProperty;(这个是Target). Binding Value=new Binding("Value"(这个是Path(Slide1的属性)).ElementName这个是source)
- Path
Binding的路径支持多级路径,比如上面访问的Path是Value的属性,那么Path下面的次级路径。
Binding的路径还可以通过索引器来作为Path,比如:上面的Path是Value的属性(如果这个Value是一个集合),那么Path也可以是Value[1]来获取集合的第二个对象
Binding的路径还可以通过多级斜线的语法去寻找多级目录下面需要的Path,对应的栗子如下:
class City { public string Name { get; set; } } class Province { public string Name { get; set; } public List<City> CityList { get; set; } } class Country { public string Name { get; set; } public List<Province> ProvinceList { get; set; } } List<Country> countryList=new List<Country>{new Country(){Name="中国"}}; List<string> List=new List<string>(){"Tim","Tom","Blog"}; this.textBox1.SetBinding(TextBox.TextProperty,new Binding("/"){Source=List}); this.textBox2.SetBinding(TextBox.TextProperty,new Binding("/Length") {Source=List,Mode=BindingMode.OneWay}); this.textBox3.SetBinding(TextBox.TextProperty,new Binding("/[2]") {Source=List,Mode=BindingMode.OneWay});
- 不带Path的Binding(Binding源本身就是数据,比如放在Resource中的文本,或者一些不属于任何对象的数值)如下,栗子如下
<StackPanel.Resources>
<sys:String x:Key="myString">
不带Path的Binding
</sys:String>
</StackPanel.Resources><TextBlock x:Name="textBlock1" TextWrapping="Wrap" Text="{Binding Path=.,Source={StaticResource ResourceKey=myString}}" FontSize="16" Margin="5"/>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了