Привязка элемента управления WPF не всегда обновляет интерфейс - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть кнопка, свойство IsEnabled которой привязано в моей модели представления к значению, указывающему, были ли изменены данные в текущем представлении. До сих пор эта привязка работала нормально, пока я не попытался добавить функциональность Drag / Drop в ItemsControl в представлении.

Функция перетаскивания работает нормально и делает все, что должна. Когда он завершает любые необходимые манипуляции с данными, он устанавливает для свойства IsModified модели представления значение true. Я подтвердил, что значение на самом деле установлено на true.

Проблема У меня заключается в том, что при изменении свойства IsModified из моего метода Drop свойство IsEnabled кнопки не обновляется; когда IsModified установлен на true во время операции перетаскивания, кнопка остается отключенной. Если я нажимаю кнопку, она внезапно обновляется и становится активной, что требует от меня нажатия кнопки второй раз, чтобы фактически сделать, как и предполагалось.

Метод Drop вызывается для события Drop элемента ItemsControl. Это вызывается из другого потока или что-то, что не информирует пользовательский интерфейс об изменении свойства? Я пытался найти вспомогательные документы, но у меня возникли проблемы.

Еще раз, установка свойства IsModified продолжает работать при любых других обстоятельствах и корректно обновляет интерфейс.

Код, о котором идет речь, довольно прост.

XAML:

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <EventSetter Event="DragEnter" Handler="IcFields_DragEnter"/>
        <EventSetter Event="Drop" Handler="IcFields_Drop"/>
    </Style>
</ItemsControl.ItemContainerStyle>

...
...
...

<Button Margin="5" Padding="10,0,10,0" IsEnabled="{Binding IsModified}"
    Command="{Binding SaveChangesCommand}">Save Changes</Button>

, где обработчик IcFields_Drop позволяет вносить изменения в модель и, в конце концов, устанавливает IsModified в true.

Edit:

Вот сокращенный пример реализации. Используйте приведенный выше XAML в качестве XAML для этого примера.

C # - код позади

private void IcFields_Drop(object sender, DragEventArgs e)
{
    ViewModel.Drop();   
}

C # - Посмотреть модель

private bool isModified;
public bool IsModified
{
    get { return isModified; }
    set { SetProperty(ref isModified, value); }
}

public void Drop()
{
    //PSEUDO: Do some drag/drop logic for the items attached to the ItemsControl.
    ...
    ...

    IsModified = true;
}

1 Ответ

1 голос
/ 16 апреля 2019

Вместо привязки свойства IsEnabled вы должны вернуть bool из метода CanExecute вашей команды, чтобы указать, следует ли включить Button. Затем вы вызываете метод, который вызывает событие CanExecuteChanged команды в вашем методе Drop().

Большинство ICommand реализаций включают метод RaiseCanExecuteChanged() или аналогичный, который можно вызвать для обновления статуса команды:

public void Drop()
{
    ...
    SaveChangesCommand.RaiseCanExecuteChanged();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...