Список, привязанный к ObservableCollection, не обновляется - PullRequest
3 голосов
/ 30 апреля 2011

Я использую 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.

Я добавил кнопку в графическом интерфейсе для перезагрузки переменных, которая при нажатии вызывает процедуру 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();
    }

Ответы [ 3 ]

3 голосов
/ 30 апреля 2011

Вам необходимо реализовать INotifyPropertyChanged для вашего VariableVieWModel, чтобы обновить привязки целевого объекта.Вы просто должны сделать это -

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));
                }
            } 
    }
3 голосов
/ 30 апреля 2011

Вы не изменили коллекцию ObservableCollection, а только заменили ее. Вы должны реализовать INotifyPropertyChanged и вызвать PropertyChanged в установщике свойств Variables.

Кстати, в реализациях MVVM обычно есть базовый класс для вашей ViewModel:

class VariableViewModel : ViewModelBase

и реализовать общие функции, такие как INotifyPropertyChanged, в базовом классе, чтобы избежать дублирования кода.

2 голосов
/ 30 апреля 2011

Проблема в том, что, вероятно, ваша VariableModel не реализует INotifyPropertyChanged . Через ObservableCollection сообщается только об изменениях в коллекции, но не об изменениях в содержащихся объектах.

Здесь вы найдете некоторые возможности реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...