【发布时间】:2013-05-14 06:16:30
【问题描述】:
在一个项目中,我使用caliburn.micro 作为 MVVM 框架。
现在我有一个用于主从视图的大视图模型。
它是分层构建的。
举个例子:
我有一个ComputerView 和一个ComputerViewModel。这里一切正常。
现在这个 ComputerViewModel 包含一个 ObservableCollection<HardwareComponentViewModel>
这个HardwareViewModel 没有附加View,它只是用来保存数据。
Caliburn 在这里没有正确设置Binding。 (我不能使用x:name 来获取Binding)
到目前为止,这没问题,因为我可以使用“正常”的绑定方式。
现在我需要在HardwareComponentViewModel 的网格中添加一个ActionMessage。
为了更清楚我的意思,这里是完整的 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 并得到了
未应用操作约定:没有可操作的展开元素。
但我不知道它试图告诉我什么。可能无法对 Grid 应用任何操作?
4。 现在已将其绑定到网格内的按钮,这有效。 作为参数,我传递了 datacontext,它确实是 HardwareComponentViewModel, 但它会冒泡到最外面的 ViewModel,其中 Binding 设置正确(ComputerViewModel)。
<Button cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">
所以问题是:我必须做些什么才能正确设置绑定? 我该怎么做才能调用 HardwareComponentViewModel 中的 ActionMessages?
【问题讨论】:
-
您可以分享您尝试使用的 XAML 来将 ActionMessage 添加到网格吗?
-
@T045T 请看看我更新的问题
-
@T045T 如果这还不够 XAML,请告诉我。视图真的很大,所以我尽量保持示例简洁。
-
问题似乎出在网格上。当然,我不能为我的情况设置 caliburn...
标签: c# mvvm binding caliburn.micro