2017-01-13 6 views
0

が動作していない、そこにビューモデルを使用して同様のポストがあると私はそれに基づいて、それを実行しようとしましたが、それは動作していない、 WPF binding textbox to dictionary entry辞書 - TextBoxの結合が、私はビューモデルを使用していない

私は自分のボタンをクリックすると、作成されたリストが作成され、辞書が作成されているので、下にある例では、そのボタンをクリックすると辞書が作成されます。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 
private Dictionary<string, string> _MyDict; 


    public Dictionary<string, string> MyDict  { 
     get { return _MyDict; } 
     set { _MyDict= value; } 
    } 
private void button_Click(object sender, RoutedEventArgs e) 
    { 
     MyDict = new Dictionary<string, string> 
     { 
      {"First", "Test1"}, 
      {"Second", "Test2"} 
     }; 
    } 
    } 
Chrilleさんのコメントに続き

XAML

Title="MainWindow" Height="350" Width="674.167"> 
<Grid> 
    <Button x:Name="createListfromTextFile" Content="hi" Click="button_Click"/> 

    <TextBox x:Name="textBox1" Text="{Binding MyDict[First], UpdateSourceTrigger=PropertyChanged}" Height="279" > 

</Grid> 

UPDATE

私はそうのようなINotifyPropertyChangedを実装することにより 、問題を修正:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

public Dictionary<string, string> MyDict 
    { 
     get { return _MyDict; } 
     set { 

      _MyDict = value; 
      if (null != PropertyChanged) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs ("MyDict")); 
      } 
     }   
    } 
    } 
+1

あなたは基本的にビューを使用していますモデル、MainWindowクラス(DataContext)。ビューモデルクラスは、変更をUIに通知するためにINotifyPropertyChangedを実装する必要があります。 – Chrille

+0

@Chrille、はい、そうです...それはうまくいきました、ありがとうございます - 申し訳ありません、私はこのようなものを持つ初心者です – JohnChris

+0

@JohnChris質問を編集する代わりに、回答を書いて受け入れてください。 – Clemens

答えて

1

MainWindowクラス(DataContext)は、INotifyPropertyChangedを実装する必要があります。

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public Dictionary<string, string> MyDict 
    { 
     get { return _MyDict; } 
     set 
     { 
      _MyDict = value; 
      PropertyChanged?.(this, new PropertyChangedEventArgs("MyDict")); 
     }   
    } 
} 

あるいはさらに良い、のviewmodel用に別のクラスを作成し、ViewModelBaseまたは類似の継承:

セッターで
public abstract class ViewModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void NotifyPropertyChanged(params string[] propertyName) 
     { 
      foreach (var prop in propertyName) 
      { 
       OnPropertyChanged(new PropertyChangedEventArgs(prop)); 
      } 
     } 

     protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged.Invoke(this, args); 
      } 
     } 
    } 

そして最後に:

public Dictionary<string, string> MyDict 
{ 
    get { return _MyDict; } 
    set 
    { 
     _MyDict = value; 
     NotifyPropertyChanged("MyDict"); 
    }   
} 
0

私はあなたのコードで見つかった主な理由あなたがインターフェイスを実装するのを忘れてしまった場合、適切な方法でそれらを実装すれば、コードが働く。次のことを試してみてください。

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    // include your code here 

    // change the property definition as like this: 
    public Dictionary<string, string> MyDict  
    { 
     get { return _MyDict; } 
     set 
     { 
      _MyDict= value; 
      NotifyPropertyChanged("MyDict"); 
     } 
    } 

    // interface implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
1

Chrilleさんのコメント私はそうのようにINotifyPropertyChangedのを実装することで、問題を修正し、次のとおりです。助けを

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
    InitializeComponent(); 
    this.DataContext = this; 
    } 

public Dictionary<string, string> MyDict 
{ 
    get { return _MyDict; } 
    set { 

     _MyDict = value; 
     if (null != PropertyChanged) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs ("MyDict")); 
     } 
    }   
} 
} 

ありがとう!

関連する問題