在caliburn micro中将控件添加到另一个控件

时间:2012-09-24 09:28:48

标签: wpf caliburn.micro

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

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

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

当我运行应用程序时,我可以看到该视图显示在屏幕上,但它没有绑定到ViewModel。我应该对bootstrap做任何更改,这样可行吗?

更多信息: 我已经创建了一个类似于教程的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>

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

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

    }

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

1 个答案:

答案 0 :(得分:1)

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

<ContentControl x:Name="NewUC"/>

由于caliburn可以通过查看Control的名称来解析数据绑定,在我的代码中,框架将NewUCView与名为NewUCViewModel(在您的示例中为NewUC)绑定,并在ContentControl palceholder中显示NewUCView的实例