我有一个设置窗口,其中包含可观察的角色和组件集合。这里的想法是,当您在左侧选择一个角色时,它会自动检查右侧与该角色关联的组件。主要问题是操作在幕后正确执行,但未反映在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")
,它应该更新。
任何类型的帮助都会受到赞赏,这可能是我错过的一件简单的事情。
答案 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");
}
}