Принудительная переоценка методов защиты в Caliburn Micro - PullRequest
2 голосов
/ 07 июля 2011

У меня есть ItemsControl, в котором есть кнопки перемещения вверх, вниз и удаления в каждом элементе (через шаблон).Мой источник ItemsControl связывается с коллекцией Предметов, которые являются моделями DataContracts / POCO (не виртуальными машинами).

Я подключил обработчик сообщений Caliburn к моей главной странице *1004* модели просмотра.

<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 ]

1 голос
/ 08 июля 2011

В ваших MoveUp и MoveDown методах вы можете уведомить пользовательский интерфейс о том, что привязки для CanMoveUp/Down были признаны недействительными, используя NotifyOfPropertyChanged(() => this.CanMoveUp); (или this.CanMoveDown, в зависимости от ситуации).

Этопри условии, что ваша ViewModel получена из Screen, Conductor или PropertyChangedBase, что и должно быть.

Обновление

Что вы хотите сделать, это рефакторингкод для привязки SelectedItem ListBox к свойству в модели представления типа Item.Фактически, Caliburn.Micro сделает это за вас, если ваш ListBox имеет, например, x:Name="Items", он будет искать свойство с именем SelectedItem (есть и другие соглашения, которые он ищет).Тогда ваши CanMoveUp/Down методы могут быть свойствами, которые проверяют свойство SelectedItem, и поэтому вы можете использовать NotifyOfPropertyChanged() для аннулирования этих привязок.

0 голосов
/ 22 июля 2011

Я закончил продвижение своего класса Item в полноценную ViewModel. Я использовал IoC / MEF, чтобы класс Item мог найти свой контейнер, чтобы он мог определить, был ли он первым или последним элементом в контейнере. Если мне нужно форсировать переоценку, я создал метод, который переоценивает свойства защиты:

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

Все еще не знаю, существует ли еще способ принудительной переоценки методов защиты

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