自动更新复选框状态不会反映在GUI中

时间:2017-03-28 13:23:29

标签: c# wpf

我有一个设置窗口,其中包含可观察的角色和组件集合。这里的想法是,当您在左侧选择一个角色时,它会自动检查右侧与该角色关联的组件。主要问题是操作在幕后正确执行,但未反映在UI上。

我的xaml设置了一个数据模板,以显示列表中的复选框:

 <ListBox Name="Components" ItemsSource="{Binding Components, Mode=TwoWay}" ScrollViewer.CanContentScroll="False">
        <ListBox.ItemTemplate>
           <DataTemplate>
              <CheckBox Content="{Binding Name}" Foreground="{DynamicResource MainForegroundColor}" IsChecked="{Binding IsChecked, Mode=TwoWay}" Margin="5 5 0 0" />
           </DataTemplate>
         </ListBox.ItemTemplate>

我的viewmodel代码非常简单,我创建了一个selectableComponent类来保存复选框状态及其信息,以及一个角色类:

public class SelectableComponent
{
    public string Name { get; set; }
    public int Id { get; set; }
    public bool IsChecked { get; set; }
} 


public class Role
{
  public string Name { get; set; }
  public string projectsToWatch { get; set; }
}

public ObservableCollection<SelectableComponent> Components { get; set; }

更改角色时调用的方法:

public void LoadSpecificRoleComponents(string role)
{

  Role r = Config.Instance.Roles.FirstOrDefault(a => string.Equals(a.Name, role, System.StringComparison.InvariantCultureIgnoreCase));

  foreach (SelectableComponent sc in Components)
  {
       if (string.Equals(r.projectsToWatch, "*"))
       {
           sc.IsChecked = true;
       }
       else
       {
           sc.IsChecked = r.projectsToWatch.Contains(sc.Name, System.StringComparison.InvariantCultureIgnoreCase);
       }
  }

    RaisePropertyChanged("Components");
}

我不明白为什么UI无法正确更新。由于我在组件上RaisePropertyChanged("Components"),它应该更新。

任何类型的帮助都会受到赞赏,这可能是我错过的一件简单的事情。

2 个答案:

答案 0 :(得分:1)

SelectableComponent需要实现INotifyPropetyChanged并为IsChecked引发RaisePropertyChanged事件:

private bool _isChecked 

public bool IsChecked { 
get{ return _isChecked;} 
set
 {
      if(_isChecked != value)
      {   _isChecked= value;
          RaisePropertyChanged("IsChecked");
      }
 }
}

答案 1 :(得分:0)

您应该为SelectableComponent实现INotifyPropertyChanged。然后这样做:

private string _name = string.Empty; 
public string Name
{
    get{ return _name;}
    set 
    {
        _name = value;
        RaisePropertyChanged("Name");
    }
}

为你的ObservableCollection做同样的事情:

private ObservableCollection<Component> _componentCollection = new ObservableCollection<Component>();
public ObservableCollection<Component> Components
{
    get{ return _componentCollection; }
    set
    {
        _componentCollection = value;
        RaisePropertyChanged("Components");
    }
}