为什么我将两个控件(例如2个TextBox)绑定到一个未实现INotifyPropertyChanged的模型的单个属性,两个文本框的内容保持同步?如何通知另一个TextBox更新源的另一个TextBox?
型号:
namespace BindingExample
{
public class PersonModel
{
public string Name { get; set; }
}
}
查看:
<Window x:Class="BindingExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BindingExample"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:PersonModel x:Key="person"></local:PersonModel>
<Style TargetType="TextBox">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="100"/>
</Style>
</Window.Resources>
<Grid DataContext="{StaticResource person}">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Grid.Row="1" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
答案 0 :(得分:1)
示例中的两个文本框使用相同的datacontext并实际共享.NET对象PersonModel的相同实例,因为资源字典WPF中静态资源的默认设置是 shared ,即,当引用静态资源时,您将始终获得相同的实例。有关MSDN上的x:Shared属性的更多信息:
MSDN article about x:Shared attribute
另一种方法是将x:Shared设置为false以便每次都获得一个新实例。另外,我必须删除示例中对datacontext的绑定,以便能够单独编辑文本框中的值。
以下XAML显示了这一点:
<Window x:Class="WpfScrollToEndBehavior.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfScrollToEndBehavior"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:PersonModel x:Key="person" x:Shared="false" Name="John Doe"> </local:PersonModel>
<Style TargetType="TextBox">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="100"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, Source={StaticResource person}}" />
<TextBox Grid.Row="1" Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, Source={StaticResource person}}" />
</Grid>
对于资源字典中的资源,x:Shared的原因设置为true是出于效率原因。通过设置x:XAML中资源字典中的资源(例如对象)上的共享将在每次引用和访问资源时为我们提供新实例。我不得不从网格中删除数据上下文,并将文本框的绑定源设置为静态资源人员。