如何在另一个项目中引用的用户控件中单击调用按钮?

时间:2013-11-16 23:30:09

标签: wpf xaml mvvm user-controls caliburn.micro

我的解决方案中有两个项目,一个名为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方法,该方法包含此列表中的产品列表和搜索名称。

我该怎么做?谢谢答案

3 个答案:

答案 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