0

私はCaliburn Microを学んでおり、このチュートリアルに似たプロジェクトを作成しました:

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=ドキュメント

次に、別のユーザー コントロールを作成して、上記のモデルに追加します。そのため、チュートリアルの shellViewModel と本質的に同じ単純なユーザー コントロールを作成しました。ビューとビュー モデルは shellViewModel と ShellView と同じですが、名前が異なります。

アプリケーションを実行すると、ビューが画面に表示されていることがわかりますが、ViewModel にバインドされていません。これが機能するように、ブートストラップに変更を加える必要がありますか?

詳細: 上記で説明したように、チュートリアルに似た wpf プロジェクトを作成しました。それはうまくいきます。

プロジェクトに新しいユーザー コントロールを追加し、NewUCView という名前を付けます。したがって、プロジェクトには次のファイルがあります。

NewUCView.xaml

<UserControl x:Class="CaliburnMicroTest.NewUCView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
  <StackPanel>
    <TextBox x:Name="Name" />
    <Button x:Name="SayHello"
            Content="Click Me" />
  </StackPanel>
</UserControl>

NewUCView.xaml.cs

namespace CaliburnMicroTest
    {
    /// <summary>
    /// Interaction logic for NewUC.xaml
    /// </summary>
    public partial class NewUCView : UserControl
    {
         public NewUCView()
        {
            InitializeComponent();
        }
    }
}

NewUCViewModel.cs

namespace CaliburnMicroTest
{
   using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.Windows;

   using global::Caliburn.Micro;

   /// <summary>
   /// TODO: Update summary.
   /// </summary>
   public class NewUCViewModel : PropertyChangedBase
   {
       string name;

       public string Name
       {
           get { return name; }
           set
           {
               name = value;
               NotifyOfPropertyChange(() => Name);
               NotifyOfPropertyChange(() => CanSayHello);
            }
       }

       public bool CanSayHello
       {
           get { return !string.IsNullOrWhiteSpace(Name); }
       }

        public void SayHello()
       {
            MessageBox.Show(string.Format("Hello {0}!", Name)); //Don't do this in real life :)
        }
   }
}

ShellView を次のように変更し、NewUCView への参照を追加します。

 <StackPanel>
    <my:NewUCView x:Name="newUC" />
    <TextBox x:Name="Name" />
    <Button x:Name="SayHello"
            Content="Click Me" />

</StackPanel>

また、次のように NewUCViewModel である newUC というプロパティを持つように ShellViewModel を変更しました。

    private NewUCViewModel newUC=new NewUCViewModel();
    public  NewUCViewModel NewUC
    {
        get
        {
            return newUC;
        }

    }

しかし、このアプリケーションを実行して最初の click me (ユーザー コントロール上) を押すと、機能しません。もう 1 つのボタン (ShellView にある) は機能します。

4

1 に答える 1

1

ユーザーコントロールをビューに直接追加するべきではなく、caliburn フレームワークにそれを任せてください。メイン ビューにプレースホルダーを追加し、ViewModel を表すプロパティにバインドする必要があります。

<ContentControl x:Name="NewUC"/>

カリバーンはコントロールの名前を調べることでデータバインディングを解決できるため、私のコードでは、フレームワークは NewUCView を NewUCViewModel という名前の例でバインドし、ContentControl プレースホルダー内に NewUCView のインスタンスを表示します。

于 2012-09-24T11:11:17.640 に答える