我有一个ItemsControl,它在每个项目中都有一个向上移动,向下移动和删除按钮(通过模板)。我的ItemsControl源绑定到一组项目,这些项目是模型DataContracts / POCO(而不是VM)。
我已在主页的视图模型中附加了Caliburn消息处理程序。
<Button cal:Message.Attach="MoveUp($dataContext)" >Up</Button>
<Button cal:Message.Attach="MoveDown($dataContext)" >Down</Button>
我相信我必须明确使用cal:Message.Attach并且不依赖于约定,因为我在我的ItemTemplate中。
查看型号:
ObservableCollection<Item> MyCollection = new ObservableCollection<Item>();
//Item class is simple -- only has a string Name property
public bool CanMoveUp(Item item)
{
var index = MyCollection.IndexOf(item);
return index > 0;
}
public void MoveUp(Item item)
{
var index = MyCollection.IndexOf(item);
if (index > 0)
{
MyCollection.Remove(item);
MyCollection.Insert(index - 1, item);
}
}
public bool CanMoveDown(Item item)
{
var index = MyCollection.IndexOf(item);
return index > -1 && index < class1.Count - 1;
}
public void MoveDown(Item item)
{
var index = MyCollection.IndexOf(item);
if (index > -1 && index < class1.Count - 1)
{
MyCollection.Remove(item);
MyCollection.Insert(index + 1, item);
}
}
首先禁用第一项“向上”按钮。当我向下移动第一个项目时,第二个项目成为第一个项目,但它的向上按钮不会自动禁用。如何强制重新评估CanMoveUp防护方法?
答案 0 :(得分:1)
在MoveUp
和MoveDown
方法中,您可以使用CanMoveUp/Down
(或适当的this.CanMoveDown)通知用户界面NotifyOfPropertyChanged(() => this.CanMoveUp);
的绑定已失效。
这假设您的ViewModel派生自Screen
,Conductor
或PropertyChangedBase
。
<强>更新强>
您要做的是重构代码,将SelectedItem
的{{1}}绑定到类型ListBox
的视图模型上的属性。事实上,Caliburn.Micro将为您执行此操作,例如,如果您的Item
有ListBox
,它将查找名为x:Name="Items"
的属性(还有其他约定,它会搜索对于)。然后,您的SelectedItem
方法可以是检查CanMoveUp/Down
属性的属性,因此您可以使用SelectedItem
使这些绑定无效。
答案 1 :(得分:0)
我最终将我的Item类提升为完整的ViewModel。我使用了IoC / MEF,以便Item类可以找到它的容器,因此它可以判断它是容器中的第一个还是最后一个项目。如果我需要强制重新评估,我创建了一个重新评估防护属性的方法:
public void ReevaluateButtons()
{
NotifyOfPropertyChange(() => CanMoveDown);
NotifyOfPropertyChange(() => CanMoveUp);
}
仍然不知道是否还有办法强制重新评估守卫方法
NotifyOfPropertyChange(() => CanMoveDown(item));