强制重新评估Caliburn Micro中的防护方法

时间:2011-07-07 16:51:01

标签: silverlight mvvm caliburn.micro

我有一个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防护方法?

2 个答案:

答案 0 :(得分:1)

MoveUpMoveDown方法中,您可以使用CanMoveUp/Down(或适当的this.CanMoveDown)通知用户界面NotifyOfPropertyChanged(() => this.CanMoveUp);的绑定已失效。

这假设您的ViewModel派生自ScreenConductorPropertyChangedBase

<强>更新

您要做的是重构代码,将SelectedItem的{​​{1}}绑定到类型ListBox的视图模型上的属性。事实上,Caliburn.Micro将为您执行此操作,例如,如果您的ItemListBox,它将查找名为x:Name="Items"的属性(还有其他约定,它会搜索对于)。然后,您的SelectedItem方法可以是检查CanMoveUp/Down属性的属性,因此您可以使用SelectedItem使这些绑定无效。

答案 1 :(得分:0)

我最终将我的Item类提升为完整的ViewModel。我使用了IoC / MEF,以便Item类可以找到它的容器,因此它可以判断它是容器中的第一个还是最后一个项目。如果我需要强制重新评估,我创建了一个重新评估防护属性的方法:

public void ReevaluateButtons()
{
    NotifyOfPropertyChange(() => CanMoveDown);
    NotifyOfPropertyChange(() => CanMoveUp);
}

仍然不知道是否还有办法强制重新评估守卫方法

NotifyOfPropertyChange(() => CanMoveDown(item));