【发布时间】:2019-04-16 22:07:55
【问题描述】:
我有一个按钮,其IsEnabled 属性在我的视图模型中绑定到一个值,该值指示当前视图中的数据是否已被修改。到目前为止,此绑定一直运行良好,直到我尝试将拖放功能添加到视图中的 ItemsControl。
Drag/Drop 功能运行良好,可以完成所有应有的工作。当它完成它需要的任何数据操作时,它会将 View Model 的IsModified 属性设置为true。我已验证该值实际上设置为true。
问题我遇到的是,当IsModified 属性从我的Drop 方法中更改时,按钮的IsEnabled 属性没有更新;在拖放操作期间将IsModified 设置为true 时,该按钮保持禁用状态。如果我单击该按钮,它会突然更新并启用,需要我再次按下该按钮才能真正按预期进行。
在 ItemsControl 项上的 Drop 事件上调用了 Drop 方法。这是从另一个线程调用的,还是没有通知 UI 属性更改的东西?我已经尝试寻找支持文档,但遇到了一些麻烦。
再一次,设置 IsModified 属性在任何其他情况下都可以继续工作,并正确更新 UI。
有问题的代码相当简单。
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。
编辑:
这里是一个简短的实现示例。使用上面的 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;
}
【问题讨论】:
-
试试这个
IsEnabled="{Binding IsModified, UpdateSourceTrigger=PropertyChanged}" -
@ikerbera 不幸的是,没有成功。
-
IsEnabled="{Binding IsModified, UpdateSourceTrigger=PropertyChanged}, Mode=OneWay"。我通常使用Mode=TwoWay,但在这种情况下感觉有点矫枉过正。看看this -
@ikerbera
Mode=TwoWay是无稽之谈,因为控件从不主动更新其 IsEnabled 属性,因此没有从目标到源的绑定方向。UpdateSourceTrigger=PropertyChanged也毫无意义,因为它只在 TwoWay 或 OneWayToSource Bindings 中起作用。 -
你的视图模型(因为代码没有显示)是否实现了inotifypropertychanged?
标签: c# wpf data-binding