2011-08-04 6 views
2

これらの方法はどれが最適ですか?XAMLのソースとDataContext

<Window.Resources> 
    <sys:Int16 x:Key="MyValue">123</sys:Int16> 
</Window.Resources> 

<StackPanel> 

    <!-- method 1 --> 
    <TextBlock Text="{Binding}" DataContext="{StaticResource MyValue}" /> 

    <!-- method 2 --> 
    <TextBlock Text="{Binding, Source={StaticResource MyValue}}" /> 

</StackPanel> 

答えて

3

多くの「より良い」質問と同様です。私は文脈に「依存する」と言います。

両方とも異なるコンテキストで目的を果たすことができるため、両方とも存在します。上に示したものだけが与えられた場合、私は例2を選択します。

しかし、DataContextを設定すると、すべての子がそのDataContextを継承します。だから代わりにボタンを使用しています。そして、あなたのボタンの中で少しジャズして、それぞれ異なる色で4回テキストを表示したいのです。 (DataContextのがボタンの上にあることに注意して、彼らは実施例2で行うようにテキストブロックは、ソースを必要としないが)

<Button DataContext="{StaticResource MyValue}" Height="Auto" Width="Auto" HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding}" Foreground="Red" /> 
     <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding}" Foreground="Blue" /> 
     <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding}" Foreground="Yellow"/> 
     <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding}" Foreground="Green" /> 
    </Grid> 
</Button> 
:あなたは以下を参照することができますように、私はその後、1

例1例を選ぶだろう

例2:あなただけの場合はInt16型のような1つの表現を持つ単純なオブジェクトに結合しているとき

<Button Height="Auto" Width="Auto" HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Red" /> 
     <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Blue" /> 
     <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Yellow"/> 
     <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding, Source={StaticResource MyValue}}" Foreground="Green" /> 
    </Grid> 
</Button> 

、あなたはおそらく一度だけ、その値を結合して表示するために行くので、オプションです2が最も理にかなっています。

「ソース」を複数のバインディングに同じものに設定している場合は、共通の親FrameworkElementのDataContextをバインドするだけです。

1

私は、私は2つの間で選択しなければならなかった場合、私はDataContextのは、より複雑な基礎となるオブジェクトに項目をデータバインディングのために本当に多くのであり、多くのデータ値のデータバインディングを緩和する方法2となるだろうと言うでしょう。

ちょうど好奇心から外れて、どうしてこのようにしていますか?あなたのコードは、ある時点でMyValueの値を変更しますか?あなたが何らかの理由でそれを行うための良い方法はありますか?

+0

私はちょっと質問をするための単純な例を考え出していました。私は実際には、このような(1つの値で)データバインドされたことはありませんが、私はDataContextとSourceの間に良いアプローチがあるかどうかを調べていました。あなたの貢献に感謝します。 –

1

DataContenxt DependencyPropertyを使用すると、DependencyObjectのすべてのプロパティを簡単にバインドできます。

バインディングのソース依存プロパティは、DataContextに関係なく、必要なソースにその特定のバインディングをポイントすることを可能にします。

これは、ListViewのより複雑なバインディングを実行しているときに非常に役立ちます。例えば:

<Window.Resources> 
    <local:MyConverter x:Key="MyConverter" /> 
</Window.Resources> 
<Grid> 
    <ComboBox ItemsSource="{Binding Source={StaticResource MyConverter}, Path=DisplayValues}" DataContenxt={Binding ElementName=lvwItems Path=SelectedItem} SelectedItem="{Binding Converter={StaticResource MyConverter}"/> 
<ListView Name="lvwItems"...... 

上記の例では、ちょうど私がDisplayValuesいわゆる「MyConverter」にプロパティへのItemsSourceを設定することを披露、DataContextのは、私がどののSelectedItemを処理している、しかしそのコンボボックス上で働いているものです'lvwItems'という名前のListViewのプロパティです。

これが役に立ちます。

+1

しかし、私の質問は最高のアプローチについてです。 –

+1

他のバインディングをどのように処理する必要があるかに応じて、どちらの方法も最適な方法です。 オブジェクト全体でより多くのバインディングを行う必要がある場合は、DataContextへのバインドが最善の方法です。 ソースを指定するのは、そのプロパティだけの単なるバインディングの場合に最適です。 –

関連する問題