1

私は次のコントロールを埋め込んでいます(継承ではなく、配置するだけです): ここに画像の説明を入力してください

ネイティブTextBlockは、MyGlobalControlに配置されているMyMiddleControlに配置されます。MyMiddleControlには、TextBox.TextにバインドされているDependencyPropery"GroupName"があります。MyGlobalControlには、MyMiddleControl.GroupNameにバインドされているパブリックプロパティ「MyText」があります。

XAML:

<UserControl x:Class="MyMiddleControl"
         ...
         DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <TextBlock Text="{Binding Path=GroupName}"/>
</UserControl>

public static readonly DependencyProperty GroupNameProperty =
    DependencyProperty.Register("GroupName", typeof(string), 
    typeof(MyMiddleControl), 
    new PropertyMetadata("default"));

public string GroupName
{
    get { return (string)GetValue(GroupNameProperty); }
    set { SetValue(GroupNameProperty, value); }
}

<UserControl x:Class="MyGlobalControl"
         ...
         DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <MyMiddleControl GroupName="{Binding MyText}"... />
</UserControl>

public string _myText = "myDef";
public string MyText
{
    get { return _myText ; }
    set { _myText = value; }
}

問題#1。プログラムを実行すると、テキストブロックに「myDef」ではなく「default」が表示されます。

問題#2。私はするボタンを持っています:

private void TestButton_Click(object sender, RoutedEventArgs e)
{
    MyText = "TestClick";
}

結果は同じです:「デフォルト」。

なんで?:(

アップデート:

私は言うのを忘れます。私が行った場合

<UserControl x:Class="MyGlobalControl"
         ...
         DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <MyMiddleControl GroupName="FixedTest"... />
</UserControl>

正常に動作します。

PS。最初の回答から変更されたサンプルプロジェクト:TestBind.zip

4

1 に答える 1

2

バインドされたプロパティの変更を通知するには、INotifyPropertyChangedを実装する必要があります

public class SampleData : INotifyPropertyChanged
{
  public SampleData ()
  {
     this.MyText = "myDef";
  }

  public string _myText;
  public string MyText
  {
    get { return _myText ; }
    set {
      _myText = value;
      this.RaisePropChanged("MyText");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  public void RaisePropChanged(string name) {
    var eh = this.PropertyChanged;
    if (eh != null) {
      eh(this, new PropertyChangedEventArgs(name));
    }
  }
}

それが役立つことを願っています

編集 は、コードビハインドでx:NameとDataContextを設定して次のソリューションを試してください

public partial class MyMiddleControl : UserControl
{
  public MyMiddleControl() {
    this.DataContext = this;
    this.InitializeComponent();
  }

  public static readonly DependencyProperty GroupNameProperty =
    DependencyProperty.Register("GroupName", typeof(string),
                                typeof(MyMiddleControl),
                                new PropertyMetadata("default"));

  public string GroupName {
    get { return (string)this.GetValue(GroupNameProperty); }
    set { this.SetValue(GroupNameProperty, value); }
  }
}

<UserControl x:Class="TestBind.MyMiddleControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="middleControl">
    <Grid>
        <TextBlock Height="40" HorizontalAlignment="Left" Margin="45,23,0,0" 
                   Name="textBlock1" Text="{Binding ElementName=middleControl, Path=GroupName}" 
                   VerticalAlignment="Top" Width="203" />
    </Grid>
</UserControl>

public partial class MyGlobalControl : UserControl, INotifyPropertyChanged
{
  public MyGlobalControl() {
    this.DataContext = this;
    this.InitializeComponent();
    this.MyText = "myDef";
  }

  public string _myText;
  public string MyText {
    get { return this._myText; }
    set {
      this._myText = value;
      this.OnPropertyChanged("MyText");
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged(string propertyName) {
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null) {
      handler(this, new PropertyChangedEventArgs(propertyName));
    }
  }

  private void button1_Click(object sender, RoutedEventArgs e) {
    this.MyText = "btnClick";
  }
}

<UserControl x:Class="TestBind.MyGlobalControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:my="clr-namespace:TestBind"
             x:Name="globalControl">
  <Grid>
    <my:MyMiddleControl HorizontalAlignment="Left"
                        Margin="24,82,0,0"
                        x:Name="myFloatTest"
                        GroupName="{Binding ElementName=globalControl, Path=MyText}"
                        VerticalAlignment="Top" />
    <Button Content="Button"
            Height="23"
            HorizontalAlignment="Left"
            Margin="296,65,0,0"
            Name="button1"
            VerticalAlignment="Top"
            Width="75"
            Click="button1_Click" />
  </Grid>
</UserControl>
于 2012-08-31T16:26:01.693 に答える