将两个WPF控件绑定到一个模型属性是否会创建共享绑定?

时间:2012-02-16 11:51:42

标签: .net wpf xaml

为什么我将两个控件(例如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>

1 个答案:

答案 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中资源字典中的资源(例如对象)上的共享将在每次引用和访问资源时为我们提供新实例。我不得不从网格中删除数据上下文,并将文本框的绑定源设置为静态资源人员。