在一个项目中,我使用caliburn.micro作为MVVM框架。

现在,对于主从 View ,我有一个较大的viewmodel。

它是分层构建的。

仅举一个例子:

我有一个ComputerViewComputerViewModel。这里一切正常。

现在,此ComputerViewModel包含一个ObservableCollection<HardwareComponentViewModel>
这个HardwareViewModel没有附加的View,它只是用来保持数据就位。
Caliburn在此处未正确设置Binding。 (我不能使用x:name来获取Binding)

到目前为止,这还没有问题,因为我可以使用“常规”绑定(bind)方式。
现在,我需要在ActionMessage的网格中添加HardwareComponentViewModel

为了更清楚我的意思,这里是完整的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}",但没有效果
Took them from this question here

2。
在网格中,我尝试过:cal:Message.Attach="[Event Click] = [Action Expand]",但也不起作用

3。
我现在添加了Logging并获得

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

但是我不知道它试图告诉我什么。也许无法对网格执行任何操作?

4。
现在将其绑定(bind)到网格内的按钮上,此方法有效。
作为参数,我传递了datacontext,它确实是HardwareComponentViewModel,
但是它冒泡到最外面的ViewModel,在这里正确设置了绑定(bind)(ComputerViewModel)。
<Button cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">

因此,问题是:为了正确设置绑定(bind),我该怎么做?
我该怎么做才能在HardwareComponentViewModel中获取ActionMessages?

最佳答案

你有没有尝试过
cal:Action.TargetWithoutContext="{Binding DataContext}"
在您的按钮/网格/您需要的任何地方?我希望该操作的目标默认情况下是当前绑定(bind),但可能不是(不确定CM如何将其连接起来,可能会查看源代码)。无论如何,CM都需要知道尝试将操作绑定(bind)到(VM)的目标,并且由于未绑定(bind)标准CM方式,我的猜测是某些连线无法自动完成,因此您需要使用以上代码

关于c# - 将caliburn.micro与分层 View 模型结构一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16636820/

10-14 10:11
查看更多