MVVM事件命令

MVVM事件命令,mvvm,eventtocommand,Mvvm,Eventtocommand,嗨,朋友们, 我正在开发MVVM WPF应用程序,我需要为TelerikRadTab控制SelectionChanged事件执行事件,我知道使用MVVM light可以很简单地使用EventToCommand行为,但我使用的是MVVM framework() 我必须使用交互触发器 对于以下内容,我添加了来自 C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\Silverlight\v4.0 在XAML中,我包括了 xmlns:I="c

嗨,朋友们, 我正在开发MVVM WPF应用程序,我需要为TelerikRadTab控制SelectionChanged事件执行事件,我知道使用MVVM light可以很简单地使用EventToCommand行为,但我使用的是MVVM framework() 我必须使用交互触发器

对于以下内容,我添加了来自

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\Silverlight\v4.0
在XAML中,我包括了

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>
xmlns:I=“clr命名空间:System.Windows.Interactivity;assembly=System.Windows.Interactivity
当我构建应用程序时,我得到以下错误

XML命名空间“”中不存在属性“EventName”


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

我正在使用mvvm light,但不需要经常使用“事件到命令”功能。我以稍微不同的方式管理了与您相同的功能:

<telerik:RadTabControl Template="{StaticResource TabControlTemplate}" 
                ItemsSource="{Binding TabbedViewModels }" SelectedItem="{Binding ActiveTabbedViewModel, Mode=TwoWay}"
                ItemTemplate="{StaticResource TabItemTemplate}" Style="{StaticResource RadTabControlStyleBorderless}" />

因此,在主windows viewmodel上,我有一个viewmodels集合,每个选项卡项一个,我将其绑定为控件的项源。 然后我将selecteditem绑定到主视图模型上的一个属性。然后在该属性的setter中,我可以执行SelectionChangedEvent中需要执行的任何特定操作。 在我的例子中,选项卡的viewmodels是根据用户启动的内容动态加载的,并且每个视图模型都可能非常不同,因此它们都继承自一个公共基类,尽管您也可以使用一个接口。 因此,集合是该bas类的ObservableCollection,selectedItem绑定到的ActiveTableViewModel属性也属于该类型

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

编辑:更详细一点-恐怕我不知道有什么博客可以给你指,所以我会解释一下我是如何做到这一点的

所以MainPage.xaml带有TabControl和内容框架。 MainPageViewModel是主页的视图模型。它有一个名为TabbedViewModels的属性,该属性是TabbedWindowViewModelBase(我为此创建的一个类)的可观察集合

//
///获取或设置TabbedViewModels的集合-每个模型将由主窗口顶部栏上的选项卡表示
/// 
公共可观察项集合选项卡ViewModels
{
得到
{
返回此选项。tabbedViewModels;
}
设置
{
this.tabbedViewModels=值;
this.RaisePropertyChanged(()=>this.TabbedViewModels);
}
}
/// 
///获取或设置活动选项卡-在更改为时绑定到选项卡栏SelectedItem
///另一个选项卡/视图模型它将页面菜单项设置为该视图模型的正确菜单项
/// 
公共CastleTabbedWindowViewModelBase活动选项卡ViewModel
{
得到
{
返回this.activeTabbedViewModel;
}
设置
{
this.activeTabbedViewModel=值;
this.RaisePropertyChanged(()=>this.ActiveTabbedViewModel);
if(值!=null)
{
//当活动选项卡发生更改时,是否希望确保打开新选项卡所在的先前打开的页面
value.DoSomething();
}
}
}
在这一点上,这取决于您的场景有多复杂。如果您有相同的视图,但只是更改数据,那么您的视图可以绑定到ActiveTabbedViewModel,因为这会引发propertychanged事件,它将自动刷新绑定并显示与新选项卡相关的数据。您可以在子vi上使用DoSomethingewmodel最初加载它的数据-您只需要这样做一次,除非您想刷新它

根据您的描述,解决此问题的一种方法是创建以下选项卡式WindowViewModel类:`

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);
    }


}
公共类选项卡WindowViewModel:ViewModelBase { 专用中继命令导航命令; /// ///获取或设置此选项卡项相对于其他选项卡项的位置/顺序 /// 公共整数菜单项{get;set;} /// ///获取或设置导航Id /// public int NavigationId{get;set;} /// ///获取或设置将为此选项卡项显示的标题 /// 公共字符串标题{get;set;} /// ///获取或设置单击选项卡项时将导航到的导航目标 /// 公共字符串导航目标{get;set;} /// ///获取或设置一个值,该值指示是否启用选项卡项 /// 公共布尔值已启用{get;set;} /// ///获取用于常规导航的命令。 /// 公共虚拟ICommand导航命令 { 得到 { 返回此.navigationCommand ?? (这是navigationCommand= 新中继通信( this.ExecuteNavigationCommand,x=>this.IsEnabled); } } 公共无效剂量测定法() { //做你需要做的一切 //然后导航到正确的页面 this.NavigationCommand.Execute(null); } 私有void ExecuteNavigationCommand(NavigationEventArgs e) { NavigationManager.NavigateToView(this.NavigationTarget); } } 请注意,NavigationManager是一个帮助导航的静态帮助器类。 然后,您可能导航到的每个视图都将从主页面继承datacontext—因此您有两个选择—您可以在选项卡WindoviewModel one上拥有DataViewModel属性,并通过ActiveTableWindow.DataViewModel将所有内容绑定到该属性。或者,正如我们所做的,在主视图上拥有每个子视图模型的属性建模并直接绑定到该属性:

        public SummaryViewModel SummaryViewModel
    {
        get
        {
                  return this.summaryViewModel
                  ?? (this.summaryViewModel = (SummaryViewModel)ViewModelFactory.GetPageViewModel<SummaryViewModel>());
        }
    }
public SummaryViewModel SummaryViewModel
{
        public SummaryViewModel SummaryViewModel
    {
        get
        {
                  return this.summaryViewModel
                  ?? (this.summaryViewModel = (SummaryViewModel)ViewModelFactory.GetPageViewModel<SummaryViewModel>());
        }
    }