2012-02-16 6 views
2

INotifyPropertyChangedを実装していないモデルの1つのプロパティに2つのコントロールをバインドすると、2つのテキストボックスがバインドされ、2つのテキストボックスの内容が同期しているのはなぜですか?他のTextBoxはソースを更新することをどのように通知されますか?2つのWPFコントロールを1つのモデルプロパティにバインドすると、共有バインディングが作成されますか?

モデル:

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

コードを表示できますか?私はこれが期待される動作だと言っていましたが、あなたは 'INotifyPropertyChanged'を実装していないと言います。この場合、' TextBox'のいずれかが更新されるとは思わないでしょう。 – ChrisF

+0

@ChrisFは、バインディングが単にsourceプロパティの値を読み取るとき、最初は期待しています。 – Clemens

+0

@ Jason Sichは、おそらくDependencyPropertyのソースプロパティですが、これはモデルクラスでは奇妙です。 – Clemens

答えて

1

あなたの例の2つのテキストボックスは、デフォルト設定のため、同じのDataContextを使用して、実際に.NETオブジェクトPersonModelの同じインスタンスを共有していますリソース辞書WPFの静的リソースのうちが共有されているのはです。つまり、静的リソースを参照する場合、常に同じインスタンスが取得されます。 MSDN上の共有属性:Xの詳細毎回新しいインスタンスを取得するにはfalseに共有:これに

MSDN article about x:Shared attribute

代替は、x設定することです。さらに、個々のテキストボックスの値を個別に編集できるように、例のdatacontextへのバインディングを削除する必要がありました。 X理由

<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> 

次のXAMLは、これを示している共有は辞書は効率上の理由でリソース内のリソースのためにtrueに設定されています。 XAMLのリソースディクショナリ内のリソース(例:オブジェクト)にx:Sharedを設定すると、リソースが参照されアクセスされるたびに新しいインスタンスが生成されます。グリッドからデータコンテキストを削除し、テキストボックスのバインディングのソースを静的リソースパーソンに設定する必要がありました。

+0

答えをありがとう。私はWPFを勉強しています。私が知っていたことから、この行動は最初は間違っていたようでした。 –

+1

"テキストボックスが同じdatacontextオブジェクトを共有するため"という答えは、2つのテキストボックスが同期している理由を説明していません。 PersonModelで 'INotifyPropertyChanged'が実装されている場合は、これが答えになります。しかし、そうではありません。 このプロセスは次のようになります。 - つまり、ユーザーによってtextbox1.Textが変更されました。 - PersonModel.Nameにバインドされ、プロパティを更新します。 しかし、どのように地球上のtextbox2.Textは、この名前のプロパティの新しい値について知りましたか? PersonModelオブジェクトは、プロパティの変更については通知しません。 – Lu55

関連する問題