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 复杂数据逻辑
路径扩展 嵌套属性/索引器 访问深层数据或集合
posted @ 2025-06-04 10:22  飘飘欲仙,欲仙欲思  阅读(52)  评论(0)    收藏  举报