我正在使用ObservableCollection来存储Windows的环境变量。
class VariableVieWModel
{
ObservableCollection<VariableModel> vars;
public ObservableCollection<VariableModel> Variables
{
get
{
return vars;
}
set
{
vars = value;
}
}
public VariableViewModel()
{
Reload();
}
public void Reload()
{
// Code to retrieve vars
}
}
此ObservableCollection绑定到ListBox。
我在GUI中添加了一个按钮来重新加载变量,在点击时,它会调用Reload()程序。
然而,ListBox内容不会改变,我不能再通过调用Reload()来添加项目到列表中。
在构造函数下,一切正常。
ListBox XAML:
<ListBox x:Name="lbVariables" Grid.Column="0" Margin="0,0,5,0" ItemsSource="{Binding Source={StaticResource variablesViewModel}, Path=Variables}" IsSynchronizedWithCurrentItem="True">
我尝试使用PropertyChanged作为UpdateSource触发器并设置大部分模式。
public void Reload()
{
vars = new ObservableCollection<VariableModel>();
RegistryKey systemVarKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment");
string[] systemVars = systemVarKey.GetValueNames();
foreach (string var in systemVars)
{
vars.Add(new VariableModel()
{
Name = var,
Values = (systemVarKey.GetValue(var, null, RegistryValueOptions.DoNotExpandEnvironmentNames) as string).Split(';').ToList<string>(),
Target = EnvironmentVariableTarget.Machine
});
}
systemVarKey.Close();
RegistryKey userVarKey = Registry.CurrentUser.OpenSubKey(@"Environment");
string[] userVars = userVarKey.GetValueNames();
foreach (string var in userVars)
{
vars.Add(new VariableModel()
{
Name = var,
Values = (userVarKey.GetValue(var, null, RegistryValueOptions.DoNotExpandEnvironmentNames) as string).Split(';').ToList<string>(),
Target = EnvironmentVariableTarget.User
});
}
userVarKey.Close();
}
答案 0 :(得分:3)
您尚未修改ObservableCollection,只更换了它。
您应该实施INotifyPropertyChanged
并在PropertyChanged
属性设置器中调用Variables
。
BTW在MVVM实现中常见的是为ViewModel提供基类:
class VariableViewModel : ViewModelBase
并在基类中实现INotifyPropertyChanged
等常用功能,以避免重复代码。
答案 1 :(得分:3)
您需要为VariableVieWModel实现INotifyPropertyChanged
以刷新目标对象绑定。你必须这样做 -
class VariableVieWModel : INotifyPropertyChanged
{ .
.
public ObservableCollection<VariableModel> Variables
{
get
{
return vars;
}
set
{
if(vars!=value)
{
vars = value;
OnPropertyChanged("Variables");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
答案 2 :(得分:2)
问题是,你的VariableModel可能没有实现INotifyPropertyChanged。通过ObservableCollection,仅报告对集合的更改,而不是对包含对象的更改。
Here你会发现一些实现的可能性。