C# 字典-文本框绑定不起作用

C# 字典-文本框绑定不起作用,c#,wpf,mvvm,inotifypropertychanged,C#,Wpf,Mvvm,Inotifypropertychanged,我没有使用视图模型,有一篇类似的帖子也使用了视图模型,我试着以此为基础来做,但它不起作用, 当我点击我的按钮时,我会创建一个列表,然后形成一个字典,所以在我的简化示例中,为了让它工作,我会在点击按钮时创建字典 代码隐藏 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = this;

我没有使用视图模型,有一篇类似的帖子也使用了视图模型,我试着以此为基础来做,但它不起作用,

当我点击我的按钮时,我会创建一个列表,然后形成一个字典,所以在我的简化示例中,为了让它工作,我会在点击按钮时创建字典

代码隐藏

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"}
       };
    }
  }

我在您的代码中发现的主要原因是,您忘记了实现接口,如果您以正确的方式实现它们,则意味着您的代码将正常工作。请尝试以下操作:

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));
        }
    }
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
//在这里包括您的代码
//更改特性定义,如下所示:
公共词典
{
获取{return\u MyDict;}
设置
{
_MyDict=数值;
通知财产变更(“MyDict”);
}
}
//接口实现
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged(字符串propertyName=“”)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}

我在您的代码中发现的主要原因是,您忘记了实现接口,如果您以正确的方式实现它们,则意味着您的代码将正常工作。请尝试以下操作:

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));
        }
    }
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
//在这里包括您的代码
//更改特性定义,如下所示:
公共词典
{
获取{return\u MyDict;}
设置
{
_MyDict=数值;
通知财产变更(“MyDict”);
}
}
//接口实现
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged(字符串propertyName=“”)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}

在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"));
        }
    }          
 }
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共主窗口()
{
初始化组件();
this.DataContext=this;
}
公共词典
{
获取{return\u MyDict;}
设置{
_MyDict=数值;
如果(null!=属性更改)
{
此.PropertyChanged(此,新PropertyChangedEventArgs(“MyDict”);
}
}          
}
}

谢谢你的帮助

在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"));
        }
    }          
 }
}
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共主窗口()
{
初始化组件();
this.DataContext=this;
}
公共词典
{
获取{return\u MyDict;}
设置{
_MyDict=数值;
如果(null!=属性更改)
{
此.PropertyChanged(此,新PropertyChangedEventArgs(“MyDict”);
}
}          
}
}
谢谢你的帮助

您的主窗口类(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"));
        }         
    }
}
最后在setter中:

public Dictionary<string, string> MyDict
{
    get { return _MyDict; }
    set 
    {
        _MyDict = value;
        NotifyPropertyChanged("MyDict");
    }         
}
公共字典MyDict
{
获取{return\u MyDict;}
设置
{
_MyDict=数值;
通知财产变更(“MyDict”);
}         
}
您的主窗口类(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"));
        }         
    }
}
最后在setter中:

public Dictionary<string, string> MyDict
{
    get { return _MyDict; }
    set 
    {
        _MyDict = value;
        NotifyPropertyChanged("MyDict");
    }         
}
公共字典MyDict
{
获取{return\u MyDict;}
设置
{
_MyDict=数值;
通知财产变更(“MyDict”);
}         
}

基本上您使用的是视图模型,即主窗口类(DataContext)。视图模型类需要实现INotifyPropertyChanged以通知UI有关更改的信息。@Chrille,是的,您是对的。。。这很有效,谢谢-对不起,我是个新手stuff@JohnChris不要编辑问题,你应该写一个答案并将其标记为已接受。@Clemens,好吧,酷,我更改了它-希望Chrille发布一个答案,这样我就可以将其标记为已接受,但他从来没有这样做:(如果我需要通过一个键索引到集合中,我可以使用一个常规的ObservableCollection并首先对其进行查询(实际上,它几乎总是足够快),或者我创建了一个扩展KeyedCollection并实现INotifyCollectionChanged的自定义集合。KC是一个IEnumerable,其中T可以是任何您想要的,这对DataTemplates非常有用。字典都是IEnumerable,因此您无法轻松利用自动数据模板选择。您基本上使用的是视图模型,您的ainWindow类(DataContext)。视图模型类需要实现INotifyPropertyChanged以通知UI有关更改的信息。@Chrille,是的,你是对的……这很有效,谢谢-很抱歉,我是这方面的新手stuff@JohnChris不要编辑问题,你应该写一个答案,并将其标记为已接受。@Clemens,好吧,酷,我改变了它-希望Chrille能发布一个答案回答,这样我就可以将它标记为接受,但他从来没有这样做:(如果我需要通过一个键索引到集合中,我要么使用一个常规的ObservableCollection并首先对其进行默认(实际上,它几乎总是足够快),或者我创建了一个自定义集合,该集合扩展了KeyedCollection并实现了INotifyCollectionChanged。KC是一个IEnumerable,其中T可以是任何您想要的,这对DataTemplates非常有用。字典都是IEnumerable,因此您无法轻松利用自动数据模板选择。