【发布时间】:2015-05-02 01:37:19
【问题描述】:
我正在尝试将 Button Command 属性绑定到 ViewModel 中的 ICommand 属性(按钮放置在 DockPanel 中)。在我设置 DockPanel 的 Visibility 属性之前它工作正常:
<DockPanel Grid.Row="1">
<Button Content="Read" Command="{Binding ButtonBeginReadCommand}" DockPanel.Dock="Right"/>
<Button Content="Write" Command="{Binding ButtonBeginWriteCommand}" DockPanel.Dock="Left"/>
</DockPanel>
但是在将 Visibility 属性添加到 DockPanel 之后,事情变得很奇怪(现在按钮不可点击,但可见性工作正常):
<DockPanel Grid.Row="1" Visibility="{Binding IsFilenameCorrect, Converter={StaticResource HiddenIfFalse}}">
<Button Content="Read" Command="{Binding ButtonBeginReadCommand}" DockPanel.Dock="Right"/>
<Button Content="Write" Command="{Binding ButtonBeginWriteCommand}" DockPanel.Dock="Left"/>
</DockPanel>
我也尝试为按钮命令设置 RelativeSource,但没有帮助:
<DockPanel Grid.Row="1" Visibility="{Binding IsFilenameCorrect, Converter={StaticResource HiddenIfFalse}}">
<Button Content="Read" Command="{Binding DataContext.ButtonBeginReadCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" DockPanel.Dock="Right"/>
<Button Content="Write" Command="{Binding DataContext.ButtonBeginWriteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" DockPanel.Dock="Left"/>
</DockPanel>
DataContext 设置为:
<Window.DataContext>
<viewModel:MainWindowViewModel/>
</Window.DataContext>
MainWindowViewModel 类的一部分。我使用了一个自定义的 AsyncCommand 实现(不记得我在哪里找到的):
...
public ICommand ButtonBeginReadCommand { get; private set; }
public MainWindowViewModel() {
...
ButtonBeginReadCommand = new AsyncCommand(async () =>
{
await Task.Delay(300);
Monitor.Enter(_locker);
...
Monitor.Exit(_locker);
});
我该如何解决这个问题?
【问题讨论】:
-
设置
Visiblity属性不会影响您的绑定。您共享的代码对我来说很好。你能分享更多代码吗? -
对不起,我使用了 CustomBoolToVis 转换器,然后尝试设置 Visibility="Visible" - 效果相同。更新了问题,添加了 MainWindowViewModel 的一部分。
-
不确定为什么要初始化
ButtonBeginRead属性?您应该初始化ButtonBeginReadCommand属性。检查我的示例代码。 -
ButtonBeginRead
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: c# wpf data-binding