У меня есть кнопка, свойство 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;
}