3

ビューを ContentControl にロードする際に問題が発生しています。これをできるだけシンプルにしようとしているので、CM に付属の Hello プロジェクトを使用しました。Hello プロジェクトが正しくコンパイルされ、実行されることを確認しました。テキストボックスとボタンを含むウィンドウを表示します。テキスト ボックスとボタンの両方が、実行時にサンプル ViewModel に接続されます。

ShellView.xaml を変更し、StackPanel コントロールを Grid コントロールに置き換え、グリッドを 4 行 1 列に設定しました。テキストボックスを最初の行に、ボタンを 2 番目の行に割り当て、2 つの個別の ContentControl を最後の 2 行に割り当てました。

<Grid Width="800" Height="600">
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Grid.Column="0" x:Name="Name" />
    <Button Grid.Row="1" Grid.Column="0" x:Name="SayHello" Content="Click Me" />
<ContentControl Grid.Row="2" Grid.Column="0" x:Name="TopMenu" 
    VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
<ContentControl Grid.Row="3" Grid.Column="0" x:Name="BottomMenu" 
    VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"></ContentControl>
</Grid>

ViewModels フォルダーに 2 つの個別の C# クラスを作成しました。これらは ViewModels であり、それぞれ TopMenuViewModel.cs と BottomMenuViewModel.cs と呼ばれます。どちらのクラスも PropertyChangedBase クラスを拡張します。これは、サンプル プロジェクトに付属する ShellViewModel.cs クラスを単に模倣したものです。

using System;
using Caliburn.Micro;
namespace TestWithCaliburnMicro.ViewModels
{
/// <summary>
/// Description of BottomMenuViewModel.
/// </summary>
public class BottomMenuViewModel : PropertyChangedBase
{
    public BottomMenuViewModel()
    {
    }

}

Views フォルダーに 2 つの個別の WPF ユーザー コントロールを作成しました。これらは対応するビューであり、それぞれ TopMenuView.xaml と BottomMenuView.xaml と呼ばれます。各 xaml に「トップ メニュー」または「ボトム メニュー」のコンテンツを含むラベルを追加して、2 つを区別しました。

<Grid>
    <Label>Bottom Menu View</Label>
</Grid>

ShellViewModel.cs クラスで、対応する ViewModel のインスタンスを返すように設定された "get" アクセサーのみを持つ 2 つのパブリック プロパティを作成しました。

    private BottomMenuViewModel _bottomMenu;
    public BottomMenuViewModel BottomMenu {
        get { return _bottomMenu; }
    }

    private TopMenuViewModel _topMenu;
    public TopMenuViewModel TopMenu {
        get { return _topMenu;} 
    }

いずれかのプロパティの get アクセサーにブレークを追加すると、プロジェクトのデバッグ時に get アクセサーが呼び出されることがわかります。BottomMenuViewModel.cs クラスのコンストラクターに int x = 0 などの単純なステートメントを追加し、その行にブレークを追加しましたが、ブレークがヒットすることはありません。これは、コンストラクターが呼び出されていないことを意味します。作成されていませんか?

私がやっていることは非常に基本的なことであり、CM Codeplex サイトの All About Conventions ドキュメントを読み、このコメントでロジックを確認しました:

うまくいけば、誰かがこれを読んで、私を正しい方向に向ける時間があるでしょう. ありがとう。

GitHub のソリューション。注: SharpDevelop 4.x GitHub ソリューションで作成

4

1 に答える 1

0

のコンストラクターでビュー モデルをインスタンス化するかShellViewModel、後でインスタンス化する場合は、ビュー モデル プロパティにセッターを追加し、NotifyOfPropertyChangeメソッドを呼び出して、それらのプロパティ参照が変更されたことを UI に通知します。

于 2012-06-19T09:41:36.350 に答える