【问题标题】:Caliburn.Micro disable default click event for ItemsControlCaliburn.Micro 禁用 ItemsControl 的默认单击事件
【发布时间】:2017-01-26 12:26:54
【问题描述】:

我有一个继承自 Conductor<T>.Collection.OneActive 的 ViewModel。在视图中,我将DataGrid 绑定到Items 属性,并将ContentControl 绑定到ActiveItem

<ContentControl x:Name="ActiveItem" DockPanel.Dock="Top"/>
    <DataGrid x:Name="Items" AutoGenerateColumns="False" SelectionMode="Single" DockPanel.Dock="Top"
              cal:Message.Attach="[Event MouseDoubleClick] = [Action test]">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding CountryCode}" Width="10*"/>
            <DataGridTextColumn Binding="{Binding Country}" Width="90*" />
        </DataGrid.Columns>
    </DataGrid>
</ContentControl>

它工作正常,除了一件事:我想在 Grid 的行之一被 DoubleClicked 时激活 DetailsViewModel。我的void test() 方法被很好地调用了,但我不能禁用 Click 方法。

有什么建议吗?

编辑

也许我不够清楚。我的问题是Conductor&lt;T&gt; 的默认行为。它不应该为单击左键而激活详细信息屏幕,而是双击。

编辑 2

Nkosi的帮助下终于找到了一些解决方法: 只需将 ContentControl 绑定从 ActiveItem 更改为 ActiveScreen

<ContentControl x:Name="ActiveScreen" DockPanel.Dock="Top"/>

在 ViewModel 中创建了ActiveScreen 属性:

private T mActiveScreen;
public T ActiveScreen
{
    get { return mActiveScreen; }
    set
    {
        mActiveScreen = value;
        NotifyOfPropertyChange(() => ActiveScreen);
    }
}

MouseDoubleClick 的绑定方法中,您只需将ActiveScreen 设置为ActiveItem

    public void test()
    {
        ActiveScreen = ActiveItem;
    }

【问题讨论】:

  • 它会激活,因为一旦您选择项目,它就会成为激活它的 ActiveItem。即使您单击一个项目,然后使用上下箭头键,它也会激活每个选定的项目。
  • 我明白了,但我怎样才能关闭此行为?
  • 可能是选择更改时激活项目?

标签: c# wpf datagrid wpfdatagrid caliburn.micro


【解决方案1】:

Caliburn 具有动作保护功能,其中Can{MethodName} 充当要调用的动作的保护。只要遵循约定,它就可以是属性或其他方法。

所以给定

public void test() { ... }

它的守卫看起来像

public bool Cantest {
    get { return //..what ever is the condition needed to allow/disable action
}

public bool Cantest() {
    return //..what ever is the condition needed to allow/disable action
}

Caliburn documentation - All About Actions

另一个需要注意的重要特性是动作守卫。当处理程序是 找到“SayHello”消息,它将检查该类是否 还有一个名为“CanSayHello”的属性或方法。如果你 有一个守卫属性和你的类实现 INotifyPropertyChanged,然后框架会观察变化 该属性并相应地重新评估守卫。

【讨论】:

  • 我更新了我的问题,我猜是因为我们有一些误解。
【解决方案2】:


在 Caliburn.Micro EventAggregator 概念是他们的。阅读对您有帮助的概念

在当前视图模型中发布消息并在 DetailsViewModel 中订阅。
它的作品。

https://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator

Caliburn.Micro EventAggregator

【讨论】:

  • 我想我了解 EventAggregator 的工作方式,但不知道在这种特定情况下这应该如何帮助我。你能更详细地解释一下吗?我也更新了我的问题。
  • 是的,您为数据网格应用了事件,只要您在数据网格内单击该事件就会触发,那很好。现在你应该创建按钮(关闭)并在按钮内部发布一条消息到主视图模型,并在主视图模型中激活主屏幕。
  • 如果它不起作用,请将详细问题发送到我的邮件。 raghavaarr559@gmail.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多