0

在我caliburn.micro用作 MVVM 框架的项目中。

现在,我有一个用于主详细信息视图的大视图模型。

它是分层构建的。

举个例子:

我有ComputerView一个ComputerViewModel。这里一切正常。

现在这个 ComputerViewModel 包含一个ObservableCollection<HardwareComponentViewModel>

HardwareViewModel没有View附加,它只是用来保存数据。Caliburn 在这里没有Binding正确设置。(我不能使用 ax:name来获得 a Binding

到目前为止,这没问题,因为我可以使用“正常”的绑定方式。现在我需要ActionMessageHardwareComponentViewModel.

为了更清楚我的意思,这里是完整的 XAML 来重现它

<UserControl x:Class="DemoApplication.Views.ComputersView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:cal="http://www.caliburnproject.org"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:s="clr-namespace:System;assembly=mscorlib"
             d:DesignHeight="300"
             d:DesignWidth="300"
             mc:Ignorable="d">
    <Grid>
        <Grid.Resources />
        <Grid.RowDefinitions>
            <RowDefinition Height="10*" />
            <RowDefinition Height="2*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>

        <Border HorizontalAlignment="Stretch"
                BorderBrush="Transparent"
                BorderThickness="0">
            <ScrollViewer HorizontalContentAlignment="Stretch"
                          Background="Yellow"
                          BorderBrush="Transparent"
                          BorderThickness="0"
                          CanContentScroll="True"
                          HorizontalScrollBarVisibility="Auto"
                          VerticalScrollBarVisibility="Auto">
                <ListView x:Name="Computers"
                          HorizontalContentAlignment="Stretch"
                          Background="Red"
                          BorderThickness="0">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Border Background="Transparent"
                                    BorderBrush="Transparent"
                                    BorderThickness="0">
                                <ListView HorizontalContentAlignment="Stretch"
                                          Background="Black"
                                          ItemsSource="{Binding HardwareComponents}">
                                    <ListView.ItemTemplate>
                                        <DataTemplate>
                                            <Border Background="Aquamarine"
                                                    BorderBrush="DarkGray"
                                                    BorderThickness="1">
                                                <Grid Background="Lime" cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">
                                                    <Grid.RowDefinitions>
                                                        <RowDefinition Height="20" />
                                                    </Grid.RowDefinitions>
                                                </Grid>
                                            </Border>
                                        </DataTemplate>
                                    </ListView.ItemTemplate>
                                </ListView>
                            </Border>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </ScrollViewer>
        </Border>
    </Grid>
</UserControl>

更新

1.在UserControl上试过cal:Bind.Model="{Binding}"了,但没有效果 从这个问题中取走他们here

2.在我试过的网格中: cal:Message.Attach="[Event Click] = [Action Expand]"但也没有用

3.我现在添加了Logging并得到

未应用操作约定:展开没有可操作的元素。

但我不知道它试图告诉我什么。也许不能对网格应用任何操作?

4.现在已经将它绑定到网格内的一个按钮,这工作。作为参数,我传递了 datacontext,它确实是 HardwareComponentViewModel,但它被冒泡到最外面的 ViewModel,其中正确设置了 Binding (ComputerViewModel)。

<Button cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">

所以问题是:我必须做些什么才能正确设置绑定?我必须做什么才能在 HardwareComponentViewModel 中调用 ActionMessages?

4

3 回答 3

1

你有没有尝试过

cal:Action.TargetWithoutContext="{Binding DataContext}"

在您的按钮/网格/您需要的任何地方?我希望操作的目标默认是当前绑定,但它可能不是(不确定 CM 究竟是如何连接它的,可能会查看源代码)。无论如何,CM 需要知道尝试将操作绑定到(VM)的目标,并且由于没有绑定标准 CM 方式,我的猜测是某些接线无法自动完成,您需要使用显式绑定它上面的代码

于 2013-05-19T20:51:17.237 回答
1

实际上,这更像是一条评论,但我将其放入答案中以具有正确的代码格式。我在类似的情况下使用过 EventTrigger,我记得它完美无缺地工作:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
        <cal:ActionMessage MethodName="Expand" />
    </i:EventTrigger>
</i:Interaction.Triggers>

其中 i 是System.Windows.Interactivity命名空间,在顶级 XAML 标记中通过

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

(不确定桌面应用程序的确切行是否应该不同)

你试过这样做吗?

于 2013-05-20T07:28:00.923 回答
1

终于成功了!

有效的事件是 MouseDown,而不是 Click!

<Grid cal:Message.Attach="[Event MouseDown] = [Action Expand($dataContext)]" Background="Lime">

非常感谢大家的帮助!

老实说,我不知道它为什么起作用,但它像魅力一样膨胀和崩溃:)

于 2013-05-20T10:29:20.730 回答