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,因此您无法轻松利用自动数据模板选择。