我正在学习Caliburn Micro,我创建了一个类似于本教程的项目:
现在我想创建另一个用户控件并将其添加到上面的模型中。所以我创建了一个简单的用户控件,它与本教程中的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上)可以工作。
答案 0 :(得分:1)
您不应将usercontrol直接添加到视图中,让caliburn框架为您执行此操作。 您需要在主视图中添加占位符并将其绑定到代表ViewModel的属性:
<ContentControl x:Name="NewUC"/>
由于caliburn可以通过查看Control的名称来解析数据绑定,在我的代码中,框架将NewUCView与名为NewUCViewModel(在您的示例中为NewUC)绑定,并在ContentControl palceholder中显示NewUCView的实例