首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM EventToCommand

MVVM EventToCommand
EN

Stack Overflow用户
提问于 2012-10-30 11:16:57
回答 1查看 988关注 0票数 0

嗨,朋友们,我正在开发MVVM WPF应用程序,我需要为TelerikRadTab Control 执行事件,我知道使用MVVM轻量级使用EventToCommand行为很简单,但是由于我使用的是MVVM框架(链接),我必须使用建议@ 链接的交互触发器来执行。

对于下面的内容,我从

代码语言:javascript
复制
C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\Silverlight\v4.0

在XAML中,我包括

代码语言:javascript
复制
xmlns:I="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity



<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
     <Command:ChangePropertyOnTarget
          Target="{Binding}" PropertyName="SelectedItems"
          Value="{Binding SelectedItems, ElementName=ItemsToChoose}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>

当我构建应用程序时,我会得到以下错误。

EventName名称空间'链接‘中不存在属性’链接‘。

任何关于这方面的建议或帮助都会有很大帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-10-30 13:00:37

我正在使用mvvm,但不需要经常使用事件来命令特性。我管理的功能与您所追求的略有不同的方式相同:

代码语言:javascript
复制
<telerik:RadTabControl Template="{StaticResource TabControlTemplate}" 
                ItemsSource="{Binding TabbedViewModels }" SelectedItem="{Binding ActiveTabbedViewModel, Mode=TwoWay}"
                ItemTemplate="{StaticResource TabItemTemplate}" Style="{StaticResource RadTabControlStyleBorderless}" />

因此,在主窗口视图模型上,我有一个视图模型集合,每个选项卡式项目一个,作为控件的项源绑定到其中。然后将选择项绑定到主视图模型上的属性。然后,在该属性的设置者中,我能够在SelectionChangedEvent中做任何我需要做的特定的事情。在我的示例中,选项卡的视图模型是根据用户启动的内容动态加载的,而且每个视图都有很大的不同,因此它们都是从公共基类继承的,尽管您也可以使用接口。因此,集合是bas类的ObservableCollection,而selectedItem绑定到的ActiveTabbedViewModel属性也是该类型的。

可能适合或不适合您的场景,但通过使用这种方法,我不需要任何交互触发器

编辑:进入更多的细节--恐怕我不知道有什么博客可以告诉你,所以我会解释一下我是如何处理这个问题的。

因此,MainPage.xaml具有TabControl和一个内容框架。MainPageViewModel是主页的视图模型。它有一个名为TabbedViewModels的属性,它是一个TabbedWindowViewModelBase的ObservableCollection (我为此目的创建的类)

代码语言:javascript
复制
        /// <summary>
    /// Gets or sets a collection of TabbedViewModels - each one will be represented by a tab on the top bar of the main window
    /// </summary>
    public ObservableItemCollection<CastleTabbedWindowViewModelBase> TabbedViewModels
    {
        get
        {
            return this.tabbedViewModels;
        }

        set
        {
            this.tabbedViewModels = value;
            this.RaisePropertyChanged(() => this.TabbedViewModels);
        }
    }

        /// <summary>
    /// Gets or sets the Active Tab - is bound to the Tab bars SelectedItem - when changing to
    /// another tab / view model it sets the page menu item to the correct one for that view model
    /// </summary>
    public CastleTabbedWindowViewModelBase ActiveTabbedViewModel
    {
        get
        {
            return this.activeTabbedViewModel;
        }

        set
        {
            this.activeTabbedViewModel = value;
            this.RaisePropertyChanged(() => this.ActiveTabbedViewModel);

            if (value != null)
            {
                // when the active tab has changed want to ensure we open the previously opened page that the new tab was on
                value.DoSomething();
            }
        }
    }

在这一点上,这取决于您的场景有多复杂。如果您有相同的视图,但只是更改数据,那么您的视图可以绑定到ActiveTabbedViewModel,因为这会引发属性更改事件,它将自动刷新绑定并显示与新选项卡相关的数据。您可以使用子视图模型上的DoSomething加载它的数据--您只需要这样做一次,除非您想刷新它。

从您所描述的情况来看,一个解决方法是创建下面的TabbedWindowViewModel类:

代码语言:javascript
复制
public class TabbedWindowViewModel :ViewModelBase
{
    private RelayCommand<NavigationEventArgs> navigationCommand;

    /// <summary>
    /// Gets or sets the position /order that this tab item is relative to the other tab items
    /// </summary>
    public int MenuOrder { get; set; }

    /// <summary>
    /// Gets or sets the Navigation Id
    /// </summary>
    public int NavigationId { get; set; }

    /// <summary>
    /// Gets or sets the Title that will be displayed for this tab item
    /// </summary>
    public string Title { get; set; }

    /// <summary>
    /// Gets or sets the navigation target that will be navigated to when the tab item is clicked
    /// </summary>
    public string NavigationTarget { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the tab item is enabled
    /// </summary>
    public bool IsEnabled { get; set; }

    /// <summary>
    /// Gets the command for regular navigation.
    /// </summary>
    public virtual ICommand NavigationCommand
    {
        get
        {
            return this.navigationCommand
                   ??
                   (this.navigationCommand =
                    new RelayCommand<NavigationEventArgs>(
                        this.ExecuteNavigationCommand, x => this.IsEnabled));
        }
    }

   public void DoSomething()
   {
       //do whatever you need to
       //then navigate to the correct page
       this.NavigationCommand.Execute(null);

   }

    private void ExecuteNavigationCommand(NavigationEventArgs e)
    {
        NavigationManager.NavigateToView(this.NavigationTarget);
    }


}

请注意,NavigationManager是一个帮助导航的静态助手类。然后,您可能导航到的每个视图都将从MainPage继承数据文本--因此您有两个选择--您可以在TabbedWindoViewModel one上拥有一个DataViewModel属性,并通过ActiveTabbedWindow.DataViewModel将所有内容绑定到该属性。或者,就像我们所做的那样,在主视图模型上为每个子视图模型设置一个属性,并直接绑定到该属性:

代码语言:javascript
复制
        public SummaryViewModel SummaryViewModel
    {
        get
        {
                  return this.summaryViewModel
                  ?? (this.summaryViewModel = (SummaryViewModel)ViewModelFactory.GetPageViewModel<SummaryViewModel>());
        }
    }

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13137854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档