WPF BindingMode 数据绑定机制
支持数据绑定,允许开发者将UI元素与数据源绑定,从而实现数据和界面的自动同步。
在 WPF 中,BindingMode 用于定义数据绑定时数据的流动方向,BindingMode枚举应该有几个不同的值,比如OneWay、TwoWay、OneTime、OneWayToSource,可能还有默认的Default。
OneWay是源到目标的单向绑定,TwoWay是双向的,OneTime只在初始化时更新一次,OneWayToSource则是目标到源的反向绑定
1. 核心模式类型
BindingMode 枚举包含以下模式:
2. 代码示例
OneWay 单向绑定
数据只能从源(通常是数据对象)流向目标(UI元素)。当源属性发生变化时,目标属性会自动更新,但目标属性的变化不会影响源属性。
<!-- 当 slider 的 Value 属性变化时,TextBlock 自动更新 -->
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneWay}"/>TwoWay 双向绑定
数据双向流动,源和目标变化会相互更新
<!-- TextBox 输入会更新源数据,源数据变化也会更新 TextBox -->
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=TwoWay}"/>OneTime 单次模式
仅在初始化时从源→目标绑定一次,之后不再更新
<!-- 仅在初始化时显示 Value,后续源变化不更新 -->
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneTime}"/>OneWayToSource 单向到源
数据从目标→源单向流动(目标变化时更新源)
<!-- TextBox 的值变化时更新源slider的 Value 属性 -->
<TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneWayToSource}"/>3. 关键注意事项
默认模式:不同依赖属性有不同默认值(如 TextBox.Text 是 TwoWay,TextBlock.Text 是 OneWay)。
双向绑定性能:频繁更新(如 UpdateSourceTrigger=PropertyChanged)可能影响性能,需合理使用。
INotifyPropertyChanged:若需源数据变化通知目标,源必须实现此接口(如 ViewModel 基类)。
OneWayToSource 场景:当目标属性是依赖属性,而源属性无法发出变更通知时,可通过此模式反向更新源。
4. 模式选择建议
表单输入 → TwoWay(如用户编辑 TextBox)。
数据展示 → OneWay 或 OneTime(如展示数据库查询结果)。
反向控制 → OneWayToSource(如通过 UI 控件调整后台计算参数)。
静态数据 → OneTime(如显示应用程序版本号)。
<Window x:Class="WpfApp3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="35"/>
<RowDefinition Height="35"/>
<RowDefinition Height="35"/>
<RowDefinition Height="35"/>
<RowDefinition Height="35"/>
<RowDefinition Height="35"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="Slider控件:" Grid.Row="0" Grid.Column="0"/>
<Slider x:Name="slider" Grid.Row="0" Grid.Column="1" Minimum="0" Maximum="100" Value="0"/>
<!--默认为 TwoWay-->
<Label Content="Mode=Default:" Grid.Row="1" Grid.Column="0"/>
<TextBox x:Name="textBlock1" Width="auto" Height="30" Grid.Row="1" Grid.Column="1" Text="{Binding ElementName=slider,Path=Value,Mode=Default}"/>
<!--OneTime(单次模式)-->
<!--仅在初始化时从源→目标绑定一次,之后不再更新-->
<Label Content="OneTime(单次模式)" Grid.Row="2" Grid.Column="0"/>
<TextBox x:Name="textBlock2" Width="auto" Height="30" Grid.Row="2" Grid.Column="1" Text="{Binding ElementName=slider,Path=Value,Mode=OneTime}"/>
<!--数据从**源(Source)→目标(Target)**单向流动(源变化时更新目标)-->
<!--OneWay模式下,数据只能从源(通常是数据对象)流向目标(UI元素)。当源属性发生变化时,目标属性会自动更新,但目标属性的变化不会影响源属性-->
<Label Content="OneWay(单向绑定)" Grid.Row="3" Grid.Column="0"/>
<TextBox x:Name="textBlock3" Width="auto" Height="30" Grid.Row="3" Grid.Column="1" Text="{Binding ElementName=slider,Path=Value,Mode=OneWay}"/>
<!--数据从目标→源单向流动(目标变化时更新源)-->
<!--OneWayToSource模式与OneWay相反,它允许数据从目标(UI元素)流向源(数据对象),但不是从源流向目标。当目标属性发生变化时,源属性会更新,但源属性的变化不会影响目标属性。-->
<Label Content="OneWayToSource(单向到源)" Grid.Row="4" Grid.Column="0"/>
<TextBox x:Name="textBlock4" Width="auto" Height="30" Grid.Row="4" Grid.Column="1" Text="{Binding ElementName=slider,Path=Value,Mode=OneWayToSource}"/>
<!--TwoWay(双向绑定)-->
<!--数据双向流动,源和目标变化会相互更新-->
<Label Content="TwoWay(双向绑定)" Grid.Row="5" Grid.Column="0"/>
<TextBox x:Name="textBlock5" Width="auto" Height="30" Grid.Row="5" Grid.Column="1" Text="{Binding ElementName=slider,Path=Value,Mode=TwoWay}"/>
</Grid>
</Window>