如何通过数据绑定将不同控件关联至不同对象
没问题,我来帮你搞定WPF里这两个Currency对象的数据绑定~ 先给你梳理下关键步骤和代码示例:
第一步:先修正两个基础问题
- XAML类名不匹配:你的后台代码是
PL.Window6,但XAML里x:Class写的是PL.Window,必须改成PL.Window6,不然运行会报错。 - 字段转属性+实现通知接口:WPF数据绑定只能绑定公共属性(不能直接绑字段),所以你后台的
Euro和USD要改成公共属性;另外Currency类必须实现INotifyPropertyChanged接口,这样属性值变化时UI才会自动更新。
第二步:实现绑定的两种常用方式
方式一:把窗口自身作为DataContext(最常用)
先调整后台代码,把字段改成属性,给Currency类加上通知接口:
namespace PL { public partial class Window6 : Window { // 改成公共属性,支持绑定 public Currency Euro { get; set; } public Currency USD { get; set; } public Window6() { InitializeComponent(); Euro = new Currency(); USD = new Currency(); // 将窗口自身设为DataContext,控件可以直接绑定窗口的属性 DataContext = this; } } // 必须实现INotifyPropertyChanged,否则UI不会响应属性变化 public class Currency : INotifyPropertyChanged { private decimal _amount; // 假设你的Currency类有Amount属性,可根据实际调整 public decimal Amount { get => _amount; set { _amount = value; OnPropertyChanged(nameof(Amount)); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
然后修改XAML,给控件绑定对应的属性:
<Window x:Class="PL.Window6" 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:PL" mc:Ignorable="d" Title="Currency Binding" Height="300" Width="400"> <StackPanel Margin="20"> <!-- 绑定到Euro对象的Amount属性 --> <StackPanel Orientation="Horizontal" Margin="0 0 0 10"> <TextBlock Text="欧元金额:" Width="80"/> <TextBox Text="{Binding Euro.Amount, UpdateSourceTrigger=PropertyChanged}" Width="150"/> </StackPanel> <!-- 绑定到USD对象的Amount属性 --> <StackPanel Orientation="Horizontal"> <TextBlock Text="美元金额:" Width="80"/> <TextBox Text="{Binding USD.Amount, UpdateSourceTrigger=PropertyChanged}" Width="150"/> </StackPanel> </StackPanel> </Window>
方式二:把Currency对象放到窗口资源中
如果不想把窗口作为DataContext,可以直接在XAML资源里实例化两个Currency对象,然后绑定:
<Window x:Class="PL.Window6" 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:PL" mc:Ignorable="d" Title="Currency Binding" Height="300" Width="400"> <!-- 资源中实例化两个Currency对象 --> <Window.Resources> <local:Currency x:Key="EuroCurrency"/> <local:Currency x:Key="USDCurrency"/> </Window.Resources> <StackPanel Margin="20"> <StackPanel Orientation="Horizontal" Margin="0 0 0 10"> <TextBlock Text="欧元金额:" Width="80"/> <TextBox Text="{Binding Amount, Source={StaticResource EuroCurrency}}" Width="150"/> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="美元金额:" Width="80"/> <TextBox Text="{Binding Amount, Source={StaticResource USDCurrency}}" Width="150"/> </StackPanel> </StackPanel> </Window>
这种方式下,后台如果需要访问这两个对象,可以用FindResource获取:
var euro = (Currency)FindResource("EuroCurrency");
关键提醒
- 一定要给
Currency类实现INotifyPropertyChanged,不然修改属性值时UI不会同步更新; - 绑定的目标属性必须是依赖属性(WPF自带的控件属性大多都是,比如
TextBox.Text),自定义控件要注意这一点。
内容的提问来源于stack exchange,提问作者RT.
相关产品推荐
相关产品推荐

