web-dev-qa-db-ja.com

WPF:シンプルなTextBoxデータバインディング

私はこのクラスを持っています:

public partial class Window1 : Window
{
    public String Name2;

    public Window1()
    {
        InitializeComponent();
        Name2 = new String('a', 5);
        myGrid.DataContext = this;
    }

    // ...
}

そして、テキストボックスに文字列Name2を表示したいと思います。

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2}"/>
</Grid>

しかし、文字列は表示されません。また、文字列Name2TimerCallbackを使用して定期的に更新される場合、データが変更されたときにテキストボックスが更新されるようにする必要がありますか?

50
Warpin

Name2はフィールドです。 WPFはプロパティにのみバインドします。次のように変更します。

public string Name2 { get; set; }

この最小限の実装では、TextBoxがName2のプログラムによる変更に応答しないことに注意してください。したがって、タイマー更新のシナリオでは、INotifyPropertyChangedを実装する必要があります。

partial class Window1 : Window, INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected void OnPropertyChanged(string propertyName)
  {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }

  private string _name2;

  public string Name2
  {
    get { return _name2; }
    set
    {
      if (value != _name2)
      {
         _name2 = value;
         OnPropertyChanged("Name2");
      }
    }
  }
}

これをWindowクラス上ではなく、別のデータオブジェクトに移動することを検討する必要があります。

75
itowlson

ウィンドウは、グリッドがデータソースとして使用するために必要なデータバインディング通知、つまり INotifyPropertyChanged インターフェイスを実装していません。

また、データバインディングはプロパティで使用するため、「Name2」文字列はパブリック変数ではなくプロパティである必要があります。

オブジェクトをデータソースとして使用するために必要なインターフェースの実装は here にあります。

7
Darien Ford

将来のニーズのためだけに。

.NET Framework 4.5を使用するVisual Studio 2013では、ウィンドウプロパティにElementName=window動作させる。

<Grid Name="myGrid" Height="437.274">
  <TextBox Text="{Binding Path=Name2, ElementName=window}"/>
</Grid>
6
Stefan Cantacuz