0

我正在学习 Caliburn Micro,并创建了一个类似于本教程的项目:

http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

现在我想创建另一个用户控件并将其添加到上述模型中。所以我创建了一个简单的用户控件,它与教程中的 shellViewModel 基本相同。视图和视图模型与 shellViewModel 和 ShellView 相同,但名称不同。

当我运行应用程序时,我可以看到该视图显示在屏幕上,但它没有绑定到 ViewModel。我应该对引导程序进行任何更改以使其有效吗?

更多信息:我创建了一个类似于上述教程的 wpf 项目。它运作良好。

我在项目中添加了一个新的用户控件并将其命名为 NewUCView。所以我的项目中有以下文件:

新UCView.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>

新UCView.xaml.cs

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

新UCViewModel.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>

还将 ShellViewModel 更改为具有一个名为 newUC 的属性,它是一个 NewUCViewModel,如下所示:

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

    }

但是当我运行这个应用程序并按第一次单击我(在用户控件上)时,它不起作用。另一个按钮(在 ShellView 上)有效。

4

1 回答 1

1

您不应该将用户控件直接添加到视图中,而让 caliburn 框架为您执行此操作。您需要在主视图中添加一个占位符并将其绑定到代表您的 ViewModel 的属性:

<ContentControl x:Name="NewUC"/>

由于 caliburn 可以通过查看控件的名称来解析数据绑定,因此在我的代码中,框架会将 NewUCView 与在您的示例中名为 NewUC 的 NewUCViewModel 绑定,并在 ContentControl 占位符内显示 NewUCView 的实例。

于 2012-09-24T11:11:17.640 回答