我正在使用ObservableCollection来存储Windows的环境变量。绑定到ObservableCollection的列表框不会更新
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()添加项目。
在构造函数下一切工作正常。
列表框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();
}
我应该添加一些特别的ListBox属性? – 2011-04-30 12:17:37
我已经更新了我的答案。你只需要从属性设置器中调用OnPropertyChanged事件。 – 2011-04-30 12:18:50
还有一件事你应该避免为财产设置相同的值,因为它会不必要地提高财产变更事件。写作财产只是一个好习惯。 – 2011-04-30 12:20:34