【发布时间】:2017-11-12 09:41:44
【问题描述】:
我正在尝试使用以下命令独立更新列表框项目背景: 型号
public class Item
{
public Item()
{
this.BackColor = new SolidColorBrush(Colors.WhiteSmoke);
}
public int Number { get; set; }
public int Duration { get; set; }
public string Name { get { return Number.ToString(); } }
public SolidColorBrush BackColor { get; set; }
}
视图模型
private ObservableCollection<Item> _items;
public ObservableCollection<Item> Items
{
get { return _items; }
set { OnPropertyChange(ref _items, value); }
}
按钮命令
public ICommand StartCommand { get; set; }
public void start()
{
foreach (var item in Items
{
item.BackColor = new SolidColorBrush(Colors.LightGreen);
// Do some work .....
}
}
导演
public MainViewModel()
{
StartCommand = new RelayCommand(start);
LoadItems();
}
Xaml
<ListBox ItemsSource="{Binding Items}" >
<ListBox.ItemTemplate>
<DataTemplate>
<Border
Height="50"
BorderThickness="1"
BorderBrush="Silver"
CornerRadius="5"
Margin="10,10,10,5"
Background="{Binding BackColor,
UpdateSourceTrigger=PropertyChanged}">
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我可以更新可观察的集合数据,删除项目但不能更改项目背景。请帮助。
"Update" :如您所见,我不想更改整个列表框的颜色,所以我不能绑定到像“ItemBackground”这样的公共属性,而是必须绑定到集合对象属性“BackColor” "
【问题讨论】:
-
我觉得不一样。因为我不想更改整个项目列表的背景颜色。我需要单独更改每个项目的颜色
-
你需要在你的
Item类中实现INotifyPropertyChanged。 -
@Fruchtzwerg 是对的,您只是缺少
INotifyPropertyChanged实现。但是,由于您使用的是 mvvm,因此您应该重新考虑将背景保存为模型中的Brush。在 mvvm 中,模型应该对视图一无所知,Brush是视图的一部分。考虑改为保存一些状态,并使用转换器将其更改为背景。 -
@CKII 在视图模型中使用像 Brush 这样的框架类型是否违反 MVVM 是这里反复讨论的问题。当然,使用类型 Brush 并不意味着您所说的“视图模型知道视图”。但是,它可以避免重复使用使用不同画笔类型的视图。但这当然不太可能发生。 IMO,使用任何不是从 UIElement 派生的类型都是完全有效的视图模型类型,如 Color、Brush、Pen、Geometry、ImageSource 等。
-
@EmadAli 注意,在后台绑定上设置
UpdateSourceTrigger=PropertyChanged是没有意义的。它仅在 TwoWay 或 OneWayToSource 绑定中有效。另请注意,您也可以写Brushes.LightGreen,而不是new SolidColorBrush(Colors.LightGreen)。