0

プロジェクトではcaliburn.micro、MVVM フレームワークとして使用します。

これで、マスター/詳細ビュー用のやや大きなビューモデルができました。

階層的に構築されています。

例を挙げると:

私は を持ってComputerViewComputerViewModelます。ここではすべて正常に動作します。

現在、この ComputerViewModel にはObservableCollection<HardwareComponentViewModel>

これHardwareViewModelView添付されていません。データを保持するためだけに存在します。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 を呼び出すにはどうすればよいですか?

4

3 に答える 3

1

最後にそれを機能させました!

動作するイベントは、Click ではなく MouseDown です。

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

ご協力いただきありがとうございます。

正直なところ、なぜ機能するのかわかりませんが、魔法のように伸縮します:)

于 2013-05-20T10:29:20.730 に答える
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 に答える