WPF之数据绑定
1.按绑定模式(Binding Mode)分类
| 绑定模式 | 数据源 → UI(默认模式) | UI → 数据源 | 一次性绑定 | 举例 |
|---|---|---|---|---|
| OneWay(单向绑定) | 是 | 否 | 否 | 只读数据展示(如 TextBlock) |
| TwoWay(双向绑定) | 是 | 是 | 否 | 双方变化实时同步(如 TextBox 默认模式) |
| OneTime(一次性绑定) | 否 | 否 | 是 | 仅在初始化时从数据源加载一次到UI,后续变化不更新 |
| OneWayToSource(反向单向绑定 | 否 | 是 | 否 | UI的变化更新数据源,但数据源变化不影响UI |
| Default(默认模式) | 可能 | 可能 | 可能 | 根据控件属性自动选择模式 |
2. 按绑定源(Binding Source)分类
数据上下文绑定(DataContext)
通过设置控件的 DataContext 属性作为隐式数据源(最常用)。
XAML
<StackPanel DataContext="{StaticResource user}"> <TextBlock Text="{Binding Name}" /> </StackPanel>
C# 代码设置
this.DataContext = new User { Name = "Alice" };
显式元素绑定(ElementName)
直接绑定到其他UI元素的属性。
XAML
<Slider x:Name="slider" Minimum="0" Maximum="100" /> <TextBlock Text="{Binding Value, ElementName=slider}" />
相对源绑定(RelativeSource)
绑定到当前元素的父级/自身等。
<!-- 绑定到父元素 -->
<TextBlock Text="{Binding Data, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
<!-- 绑定到自身 -->
<Slider x:Name="slider">
<TextBlock Text="{Binding Value, RelativeSource={RelativeSource Self}}" />
</Slider>
静态资源绑定(StaticResource)
**绑定到资源字典中的静态数据 **
<Window.Resources>
<sys:String x:Key="appName">MyApp</sys:String>
</Window.Resources>
<TextBlock Text="{Binding Source={StaticResource appName}}" />
动态资源绑定(DynamicResource)
**绑定动态更新的资源(如主题切换 **
<TextBlock Background="{DynamicResource ThemeBrush}" />
索引器绑定
**绑定集合的索引项 **
<TextBlock Text="{Binding Users[0].Name}" />
3. 高级绑定形式
多绑定(MultiBinding)
组合多个数据源,通过转换器(IMultiValueConverter)输出结果
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource nameConverter}">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
优先级绑定(PriorityBinding)
按优先级尝试多个绑定,返回首个成功结果
<TextBlock>
<PriorityBinding>
<Binding Path="FastService" />
<Binding Path="SlowService" />
</PriorityBinding>
</TextBlock>
模板绑定(TemplateBinding)
在控件模板(ControlTemplate)中绑定模板化父级的属性
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}">
<ContentPresenter />
</Border>
</ControlTemplate>
4. 绑定路径(Path)的扩展形式
嵌套属性
<TextBlock Text="{Binding User.Address.City}" />
集合索引
<TextBlock Text="{Binding Users[0].Name}" />
附加属性
<TextBlock Text="{Binding (Grid.Row), RelativeSource={RelativeSource Self}}" />
5.关键概念总结
| 分类 | 形式 | 适用场景 |
|---|---|---|
| 绑定模式 | OneWay/TwoWay/OneTime | 控制数据流方向 |
| 绑定源 | DataContext/ElementName | 指定数据来源 |
| 高级绑定 | MultiBinding/Priority | 复杂数据逻辑 |
| 路径扩展 | 嵌套属性/索引器 | 访问深层数据或集合 |

浙公网安备 33010602011771号