如何在属性更改时更改 UI 元素?
How do i make a UIElement change when a propertie change?
我正在尝试制作一个非常简单的应用程序来学习数据绑定和事件。下面的代码应该在我单击按钮时更改标签内容,但实际上它更改了 属性 但不更新标签。
这是主要代码:
public MainWindow()
{
InitializeComponent();
environments = new ObservableCollection<Env>();
environments.Add(new Env("env1", new ObservableCollection<Cell>()));
environments.Add(new Env("env2", new ObservableCollection<Cell>()));
foreach (Env e in environments)
{
Label label = new Label
{
Content = e.Name
};
pnlMain.Children.Add(label);
}
}
private void ChangeEnvName_Click(object sender, RoutedEventArgs e)
{
foreach (Env env in environments)
{
env.Name = "test";
}
}
这是环境 class :
class Env : INotifyPropertyChanged
{
//membres
#region membres
private string _name;
private ObservableCollection<Cell> _cells;
#endregion
//propriétés
#region propriétés
public string Name
{
get { return this._name; }
set
{
if (this._name != value)
{
this._name = value;
this.NotifyPropertyChanged("Name");
}
}
}
public ObservableCollection<Cell> Cells
{
get { return this._cells; }
set
{
if (this._cells != value)
{
this._cells = value;
this.NotifyPropertyChanged("Cells");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
//méthodes
#region méthodes
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
#endregion
//constructeur
#region contructeur
public Env(string name, ObservableCollection<Cell> cells)
{
_name = name;
_cells = cells;
}
#endregion
}
有什么问题吗?是不是假设我更新 Env.Name
时更新 label.content
?
您还没有将 Label
的 Content
属性 绑定到 Name
属性。您刚刚将其设置为 string
。试试这个:
foreach (Env e in environments)
{
Label label = new Label();
label.SetBinding(Label.ContentProperty, new Binding("Name") { Source = e });
pnlMain.Children.Add(label);
}
或者创建一个 Environments
属性 returns environments
,将 DataContext
设置为 this
并绑定到 Environments[index].Name
.如果您不指定绑定的显式 Source
,它将在其当前 DataContext
中查找可能从父元素继承的 属性。请参阅 docs 了解更多信息。
我正在尝试制作一个非常简单的应用程序来学习数据绑定和事件。下面的代码应该在我单击按钮时更改标签内容,但实际上它更改了 属性 但不更新标签。
这是主要代码:
public MainWindow()
{
InitializeComponent();
environments = new ObservableCollection<Env>();
environments.Add(new Env("env1", new ObservableCollection<Cell>()));
environments.Add(new Env("env2", new ObservableCollection<Cell>()));
foreach (Env e in environments)
{
Label label = new Label
{
Content = e.Name
};
pnlMain.Children.Add(label);
}
}
private void ChangeEnvName_Click(object sender, RoutedEventArgs e)
{
foreach (Env env in environments)
{
env.Name = "test";
}
}
这是环境 class :
class Env : INotifyPropertyChanged
{
//membres
#region membres
private string _name;
private ObservableCollection<Cell> _cells;
#endregion
//propriétés
#region propriétés
public string Name
{
get { return this._name; }
set
{
if (this._name != value)
{
this._name = value;
this.NotifyPropertyChanged("Name");
}
}
}
public ObservableCollection<Cell> Cells
{
get { return this._cells; }
set
{
if (this._cells != value)
{
this._cells = value;
this.NotifyPropertyChanged("Cells");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
//méthodes
#region méthodes
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
#endregion
//constructeur
#region contructeur
public Env(string name, ObservableCollection<Cell> cells)
{
_name = name;
_cells = cells;
}
#endregion
}
有什么问题吗?是不是假设我更新 Env.Name
时更新 label.content
?
您还没有将 Label
的 Content
属性 绑定到 Name
属性。您刚刚将其设置为 string
。试试这个:
foreach (Env e in environments)
{
Label label = new Label();
label.SetBinding(Label.ContentProperty, new Binding("Name") { Source = e });
pnlMain.Children.Add(label);
}
或者创建一个 Environments
属性 returns environments
,将 DataContext
设置为 this
并绑定到 Environments[index].Name
.如果您不指定绑定的显式 Source
,它将在其当前 DataContext
中查找可能从父元素继承的 属性。请参阅 docs 了解更多信息。