プロジェクトではcaliburn.micro
、MVVM フレームワークとして使用します。
これで、マスター/詳細ビュー用のやや大きなビューモデルができました。
階層的に構築されています。
例を挙げると:
私は を持ってComputerView
いComputerViewModel
ます。ここではすべて正常に動作します。
現在、この ComputerViewModel にはObservableCollection<HardwareComponentViewModel>
これHardwareViewModel
はView
添付されていません。データを保持するためだけに存在します。Binding
ここでは、Caliburn が正しくセットアップされません。( a を使用して ax: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>
アップデート
1. cal:Bind.Model="{Binding}"
UserControl を試してみましたが、効果はありませ
ん
2.私が試したグリッドで:
cal:Message.Attach="[Event Click] = [Action Expand]"
しかしどちらもうまくいきませんでした
3. Logging を追加して取得しました
アクション規約が適用されない: Expand の実行可能な要素はありません。
しかし、それが私に何を伝えようとしているのか、私にはわかりません。おそらく、グリッドに適用できるアクションはありませんか?
4. これで、グリッド内のボタンにバインドされました。これで機能します。パラメータとして、実際には HardwareComponentViewModel である datacontext を渡しますが、バインディングが正しく設定されている最も外側の ViewModel (ComputerViewModel) にバブリングされます。
<Button cal:Message.Attach="[Event Click] = [Action Expand($dataContext)]">
問題は、Binding を正しくセットアップするにはどうすればよいかということです。HardwareComponentViewModel の ActionMessages を呼び出すにはどうすればよいですか?