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()プロシージャが呼び出されます。
リストボックスの内容は変更されず、Reload()を呼び出すリストにアイテムを追加することはできません。
コンストラクタの下ですべて正常に動作しています。
のListBox XAML:
<ListBox x:Name="lbVariables" Grid.Column="0" Margin="0,0,5,0" ItemsSource="{Binding Source={StaticResource variablesViewModel}, Path=Variables}" IsSynchronizedWithCurrentItem="True">
私はまた、UpdateSourceトリガーとしてのPropertyChangedとモードのほとんどを設定し使用してみました。
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のプロパティに何かを追加する必要がありますか? –
私は自分の答えを更新しました。あなたはあなたのプロパティセッターからOnPropertyChangedイベントを呼び出す必要があります。 –
もう1つのことは、不必要にプロパティー変更イベントを発生させるため、プロパティーに同じ値を設定しないでください。プロパティを書くための良い習慣です。 –