我的解决方案中有两个项目,一个名为UserControls的WPF用户控件库和另一个名为ShopApplication的WPF应用程序。
在UserControls中,我创建了一个名为Product的简单类,其中包含一些属性(字符串名称示例)和由Caliburn Micro MVVM模式设计的用户控制器,...我的View是Views文件夹中的ProductListView.xaml,viewmodel名为ProductListViewModel.cs在ViewModels文件夹中。 ShopApplication始终是MVVM设计。
我的观点如下:
<UserControl x:Class="UserControls.Views.ProductListView"
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"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="600"
>
<Grid>
<TextBox Name="SearchingText"/>
<Button x:Name="Search" Content="Search"
cal:Message.Attach="[Click]=[Search()]"/>
</Grid>
</UserControl>
在我的ViewModel中,我有一个名为Search()的方法。
当我通过这种方式将我的用户控件包含到ShopApplication(在应用程序窗口视图中)时:
<ContentControl DataContext="AreBoughtControl" >
<userControls:ProductListView/>
</ContentControl>
<ContentControl DataContext="WillNeedToBuyControl" >
<userControls:ProductListView/>
</ContentControl>
总是当我点击“搜索”按钮时,“异常”未处理(找不到方法搜索的目标。)。但是当我在应用程序窗口的ViewModel中定义Search方法时,可以调用方法。
但我不想在ShopApplication中使用invoke方法,我需要在UserControl中使用Invoke方法,该方法包含此列表中的产品列表和搜索名称。
我该怎么做?谢谢答案
答案 0 :(得分:0)
我想到了两件事:
1)您没有以正确的方式描述按钮,尝试
<Button cal:Message.Attach="Search" />
2)为什么要放置UserControls 作为ContentControl中的内容,这不是使用ContentControl, UserControls派生自ContentControls并描述内容。
<userControls:ProductListView DataContext="AreBoughtControl"/>
<userControls:ProductListView DataContext="WillNeedToBuyControl"/>
此外,我假设你的Window的DataContext中有2个属性叫做AreBoughtControl和 WillNeedToBuyControl和它们都是你想要的类型,检查一下是否是这样..
答案 1 :(得分:0)
是的,我有两个属性od类型ObservableCollection(); 但是你的建议不对,...只有将Search方法放入ShopApplication Viewmodel时,仍然找不到搜索方法 这是我的ProductListViewModel:
namespace UserControls.ViewModels
{
public class ProductListViewModel :
Screen,INotifyCollectionChanged
{
public ObservableCollection<Product> Products {
get; set; }
public
ObservableCollection<Product>FilteredProduct{get;
set; }
public ProductListViewModel()
{
Products = new ObservableCollection<Product>();
FilteredProducts = new ObservableCollection<Product>();
}
public void Search()
{
//search in collection
}
和我的应用程序ViewModel:
namespace ShopApplication.ViewModels
{
public class ShopViewModel :
Screen,INotifyCollectionChanged
{
private Screen _areBoughtControl;
private Screen _willNeedToBuycontrol;
public Screen AreBoughtControl
{
get { return _areBoughtControl; }
set
{
if (Equals(value, _areBoughtControl)) return;
_areBoughtControl = value;
NotifyOfPropertyChange(() => AreBoughtControl);
}
}
public Screen WillNeedToBuycontrol
{
get { return _willNeedToBuycontrol; }
set
{
if (Equals(value, _willNeedToBuycontrol)) return;
_willNeedToBuycontrol = value;
NotifyOfPropertyChange(() => WillNeedToBuycontrol);
}
}
public ShopViewModel()
{
AreBoughtControl = new ProductListViewModel();
WillNeedToBuycontrol = new ProductListViewModel();
}
//public void Search()
//{
//}
}
}
我想在ProductListViewModel中调用onClick方法,而不是在ShopApplicationViewModel中调用
答案 2 :(得分:0)
我无法弄清楚为什么在点击按钮时会抛出异常。或者,您可以为按钮单击实现ICommand,而不是直接将搜索方法绑定到按钮单击。这将很容易解决您的问题。由于您的以下MVVM很容易实现ICommand。
有关ICommand
的详细信息,请参阅以下链接http://theprofessionalspoint.blogspot.in/2013/04/icommand-interface-and-relaycommand.html
http://www.codeproject.com/Articles/126249/MVVM-Pattern-in-WPF-A-Simple-Tutorial-for-Absolute