7

以下のxamlをMainWindow.xamlに含める:

<Window x:Class="TestDependency.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
    <Grid.RowDefinitions>
      <RowDefinition></RowDefinition>
      <RowDefinition></RowDefinition>
      <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Label Name="someLabel" Grid.Row="0"  Content="{Binding Path=LabelText}"></Label>
    <Button Grid.Row="2"  Click="Button_Click">Change</Button>
  </Grid>
</Window>

そして、MainWindow.xaml.csの背後にある次のコード:

public static readonly DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText", typeof(String), typeof(MainWindow));

public int counter = 0;

public String LabelText
{
  get
  {
    return (String)GetValue(LabelTextProperty);
  }

  set
  {
    SetValue(LabelTextProperty, value);
  }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
  LabelText = "Counter " + counter++;
}

DataContextデフォルトはコードビハインドだと思っていたでしょう。しかし、私はを指定することを余儀なくされていますDataContextデフォルトはどれですか?DataContext Null?私は、背後にあるコードが(同じクラスのように)あっただろうと思っていたでしょう。

そして、このサンプルのように、ラベルのコンテンツを変更するためにコードビハインドを使用しています。直接使用できますか?

someLabel.Content = "Counter " + counter++;

DataContextコードビハインドであるため、が別のクラスにある場合に発生するUI更新の問題は発生しないはずです。

4

2 に答える 2

6

はい、のデフォルト値はDataContextです。これがクラスnullでの宣言方法です-FrameworkElement

public static readonly DependencyProperty DataContextProperty = 
    DependencyProperty.Register("DataContext", typeof(object),
    FrameworkElement._typeofThis,
    (PropertyMetadata) new FrameworkPropertyMetadata((object)null,
        FrameworkPropertyMetadataOptions.Inherits,
        new PropertyChangedCallback(FrameworkElement.OnDataContextChanged)));

FrameworkPropertyMetadataプロパティのデフォルト値の最初のパラメータを取ります。

すべての子に継承されるため、ウィンドウデータコンテキストを指定しない限り、ラベルのDataContext残りが制御されます。null

someLabel.Content = "Counter " + counter++;また、コードビハインドでラベルの内容を設定するために使用できます。そのため、コードビハインドでコントロールにアクセスすることはまったく問題ありません。

于 2012-06-13T09:50:15.657 に答える
3

のプロパティをバインドしているのでLabel、別のバインドソースを指定しない限り、バインドエンジンはそれLabelTextがそのクラスのプロパティであると想定します。Labelはバインディングソースの子孫であるため、MainWindowそのウィンドウである必要があることを魔法のように判断することはできません。そのため、明示的に宣言する必要があります。

「データコンテキスト」と「バインディングソース」の概念は異なることに注意することが重要です。バインディングソースを指定する1つの方法DataContextですが、他もあります

于 2012-06-13T09:35:27.193 に答える