web-dev-qa-db-ja.com

WPFのコントロールでローカルプロパティをバインドする方法

WPFには2つのコントロールがあります

<Button HorizontalAlignment="Center"
        Name="btnChange"
        Click="btnChange_Click"
        Content="Click Me" />

<Label Name="lblCompanyId"
       HorizontalAlignment="Center"
       DataContext="{Binding ElementName=_this}"
       Content="{Binding Path=CompanyName}" />

ラベルが(ビハインドコードで)ローカルプロパティにバインドされていることがわかるように、ボタンをクリックしてもラベルに値が表示されません...

以下は私の背後にあるコードです...

public static readonly DependencyProperty CompanyNameProperty =
  DependencyProperty.Register("CompanyName", typeof(string), typeof(Window3), new UIPropertyMetadata(string.Empty));

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

private void btnChange_Click(object sender, RoutedEventArgs e) {
  this.CompanyName = "This is new company from code beind";
}

よろしく、

24
usergaro

試してみる

Content="{Binding ElementName=_this, Path=CompanyName}"

DataContextバインディングなし

[〜#〜] edit [〜#〜]

私はあなたのコードに問題はありません、あなたのウィンドウにx:Name="_this"

<Window x:Class="WpfStackOverflowSpielWiese.Window3"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="Window3"
        Height="300"
        Width="300"
        x:Name="_this">
  <Grid>
    <StackPanel>
      <Button HorizontalAlignment="Center"
              Name="btnChange"
              Click="btnChange_Click"
              Content="Click Me" />

      <Label Name="lblCompanyId"
             HorizontalAlignment="Center"
             DataContext="{Binding ElementName=_this}"
             Content="{Binding Path=CompanyName}"></Label>

    </StackPanel>
  </Grid>
</Window>

あなたのウィンドウは本当にWindow3

public partial class Window3 : Window
{
  public Window3() {
    this.InitializeComponent();
  }

  public static readonly DependencyProperty CompanyNameProperty =
    DependencyProperty.Register("CompanyName", typeof(string), typeof(Window3), new UIPropertyMetadata(string.Empty));

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

  private void btnChange_Click(object sender, RoutedEventArgs e) {
    this.CompanyName = "This is new company from code beind";
  }
}

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

42
punker76

現在、ラベルのDataContextButtonにバインドしてから、ContentCompanyNameに設定しようとしていますが、CompanyNameはそうではありませんButtonの有効なプロパティ

Button.DataContext.CompanyNameの代わりにButton.CompanyNameにバインドするには、バインディングDataContextPathを指定します

また、DataContextとContentの両方をバインドするのではなく、Contentをバインドすることをお勧めします

<Label Content="{Binding ElementName=btnChange, Path=DataContext.CompanyName}" />

コードが投稿されたコードサンプルとまったく同じように見える場合、ButtonLabelの両方が同じDataContextを持っているので、CompanyNameに直接バインドできます。

<Label Content="{Binding CompanyName}" />

編集

ラベルのバインディングが_thisという名前のコントロールに対応していることに注意してください。ボタンの名前は_thisではなくbtnChangeであることがわかりましたが、それがボタンであると想定していました。

しかし、それは問題ではありません、答えはまだ同じです。有効なプロパティではないUIコントロールのCompanyNameプロパティにバインドしようとしています。

5
Rachel