2017-12-21 11 views
0

を表示するバインディング:UWP:私の見解モデルではモデルプロパティ

public string MyProperty{ get; set; } 

public MyViewModel() 
{ 
    MyProperty = "hello"; 
} 

私は、文字列プロパティを定義しています。

は今、私のページから、私は、このプロパティにバインドする:

Text="{Binding MyProperty}" 

が、これは動作していない - 何のテキストが表示されません。私は何が欠けていますか?

編集: 私のビューモデルが継承から:

public class Observable : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null) 
     { 
      if (Equals(storage, value)) 
      { 
       return; 
      } 

      storage = value; 
      OnPropertyChanged(propertyName); 
     } 

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

編集2:

private string _myProperty; 

     public string MyProperty 
     { 
      get => _myProperty; 
      set => Set(ref _myProperty, value); 
     } 

     public MyViewModel() 
     { 
      _myProperty = "hello"; 
     } 

とXAML::私は私のビューモデルを変更した

Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

まだ動作していません。

編集3:

public sealed partial class MyControl : UserControl 
    { 
     public MyControl() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     public string Text 
     { 
      get => (string)GetValue(s_textProperty); 
      set => SetValue(s_textProperty, value); 
     } 

     public static readonly DependencyProperty s_textProperty = 
      DependencyProperty.Register("Text", typeof(string), typeof(MyControl), new PropertyMetadata(null)); 
    } 

と私が持っているコントロールのXAMLで:

<TextBlock Text="{Binding Text}" /> 

私はこの問題は、Textプロパティは、カスタムコントロールの登録依存関係プロパティであるということだと思いますこれは:

<MyControl Text="{Binding MyProperty}"/> 

です私はカスタムコントロールを使用するページで。

+0

ビューにdatacontextを設定しましたか? var view = new MyView(); var viewModel = new MyViewModel(); view.DataContext = viewModel; – JanMer

+0

@JanWidmer私は持っています。 – Eutherpy

+0

ラベルのテキストをバインドしますか? – JanMer

答えて

3

あなたのクラスは、次のようにINotifyPropertyChangedとhavepropertyアクセサを実装する必要があります。

Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

備考:XAMLで

public event PropertyChangedEventHandler PropertyChanged; 

private string _myProperty; 

public string MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     _myProperty = value; 
     OnPropertyChanged(); 
    } 
} 

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

モード=双方向 - プロパティがUI上との両方で変更されますいずれかで変更された場合はコード。 UpdateSourceTrigger - PropertyChangedイベントに反応します。 また、DataContextの読ん:)

+0

IDは[AddInotifyPropertyChangedInterface]を持つクラスBaseViewModelを推奨し、すべてのViewModelはこれを実装します – JanMer

+0

私は実際にObservableから継承します。私は私の質問を編集しました。 – Eutherpy

+0

@Eutherpy、あなたはまだゲッターメソッドとセッターメソッドがありません。私の "MyProperty"の本文を参照してください:) –

1

あなたのセッターは、明示的にObservable.Set()メソッドを呼び出す必要があります:あなたが使用することはできませんので

private string _myProperty; 
public string MyProperty 
{ 
    get { return _myProperty; } 
    set { this.Set<string>(ref _myProperty, value); } 
} 

は残念ながら、自動車には、あなたのためINPCを実装していませんがそれら。マイクロソフトではこれをfeature requestとしていましたが、それは減っているようです。

3

は、私はそれを実装するためにPropertyChanged.Fody Nuget(https://www.nuget.org/packages/PropertyChanged.Fody/

そのシンプルを追加recomment。

[AddINotifyPropertyChangedInterface] 
public class MyViewModel 
{ 
    public string MyProperty { get; set; } 

    public MyViewModel() 
    { 
     MyProperty = "hello"; 
    } 
} 

@DavidHruška氏によると、XAMLのバインディングも編集しています。

関連する問題