В проекте я использую caliburn.micro
в качестве рамки MVVM.Использование caliburn.micro с иерархической структурой вида просмотра
Теперь у меня есть несколько большая модель просмотра для представления основных деталей.
Это иерархически построенный.
Просто есть пример:
У меня есть ComputerView
с ComputerViewModel
. Здесь все отлично.
Сейчас этот ComputerViewModel содержит ObservableCollection<HardwareComponentViewModel>
Это HardwareViewModel
не имеет View
прикрепленную, это только там, чтобы сохранить данные на месте. Caliburn не настроен здесь Binding
. (Я не могу использовать x:name
, чтобы получить Binding
)
До сих пор это не было проблемой, поскольку я мог использовать «нормальный» способ привязки. Теперь мне нужно добавить 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>
Update
1. Пытались cal:Bind.Model="{Binding}"
на UserControl, но никакого эффекта Took them from this question here
2. В сетке я попробовал: cal:Message.Attach="[Event Click] = [Action Expand]"
, но не работает, либо
3. Я добавил Лесоразработку сейчас и получите
Конвенции Действия Не Прикладное: Нет действенный элемента для Expand.
Но я не знаю, что он пытается мне сказать. Возможно, никакое действие не может быть применено к Grid?
4. Теперь привязали его к кнопке внутри сетки, это работает. В качестве параметра передаю datacontext, который действительно является HardwareComponentViewModel, , но он барботируется самому внешнему ViewModel, где привязка настроена правильно (ComputerViewModel).
<Button cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">
Таким образом, вопрос: Что я должен сделать, чтобы получить Binding настроить правильно? Что мне нужно сделать, чтобы вызвать ActionMessages в HardwareComponentViewModel?
Можете ли вы поделиться XAML вы пытались использовать, чтобы добавить ActionMessage к сетке? – T045T
@ T045T Пожалуйста, посмотрите мой обновленный вопрос –
@ T045T Если этого недостаточно XAML, пожалуйста, дайте мне знать. Вид действительно большой, поэтому я попытался сделать пример кратким. –