2015-11-03 101 views
2

我已阅读关于EventToCommand论坛上提供的每个答案,无法让我的事件触发。这是构成我的问题的代码片段。我正在使用Visual Studio 2015社区版。MVVM Light EventToCommand - 无法获取evnt触发

用户控件声明:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="http://www.galasoft.ch/mvvmlight" 


<UserControl.DataContext> 
    <vm:MenuTreeViewModel></vm:MenuTreeViewModel> 
</UserControl.DataContext> 

<syncfusion:TreeViewAdv x:Name="treeMain" Width="340" Margin="10,0,0,0"  
    ItemsSource="{Binding Collection, Mode=TwoWay, 
    UpdateSourceTrigger=PropertyChanged}" Grid.ColumnSpan="1" 
           VisualStyle="ShinyBlue" FontFamily="Verdana" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top" VerticalAlignment="Top" 
           HorizontalAlignment="Left" FontSize="11" Height="768" 
           ScrollViewer.VerticalScrollBarVisibility="Auto" Visibility="Visible"> 

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectedItemChanged"> 
     <cmd:EventToCommand Command="{Binding DataContext.SelectedItemChanged, 
            ElementName=treeMain, Mode=OneWay}" 
            PassEventArgsToCommand="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

我的视图模型逻辑:

MenuTreeViewModel代码:

public void SelectedItemChanged(object sender, 
            RoutedPropertyChangedEventArgs<object> e) 
     { 
      if (e.NewValue is Models.MenuTree) 
      { 
       // This is the Top Level Clients item 
       // Nothing needs to be done. 
       // clear out Current items of all Model types 
       // MenuTree tree = (MenuTree)e.NewValue; 

      } 
      if (e.NewValue is Models.Provider) 
      { 
       //MessageBox.Show("Provider"; 
       // Set CurrentProvider to the selected item. 
       Dal db = new Dal(); 
      } 
      if (e.NewValue is Models.Batch) 
      { 
       MessageBox.Show("Batch"); 
      } 
      if (e.NewValue is Models.Consumer) 
      { 
       MessageBox.Show("Consumer"); 
      } 
     } 
    } 

我知道我必须失去了一些东西。有人可以帮忙吗?

谢谢你。

戴夫ķ

+3

我不认为你可以绑定到这样的默认方法....你需要一个'ICommand'运行你的方法。 – Rachel

+0

就像@Rachel说的,你只能绑定一个'ICommand'。因此,名称,事件*命令*。 – Andro

回答

0

@Rachel是正确

您使用MvvmLight所以使用内置继电器命令。将其放入您的视图模型中,并绑定到公共属性MyCommand或您将其重命名为的任何内容。

public RelayCommand MyCommand 
{ 
    get; 
    private set; 
} 

public MainViewModel() 
{ 
    MyCommand = new RelayCommand( 
    ExecuteMyCommand, 
    () => _canExecuteMyCommand); 
} 

private void ExecuteMyCommand() 
{ 
    // Do something 
} 

你需要做一些阅读,以确保你明白这一点,你不应该使用虚拟机相关的功能的控制事件MVVM

看看HERE

0

可以使用不调用方法EventToCommand,该属性应该是一个命令。

你可以尝试以下,使其工作

MenuTreeViewModel.cs

public class MenuTreeViewModel 
{ 
    public ICommand SelectedValueUpdated { get; set; } 

    public MenuTreeViewModel() 
    { 
      SelectedValueUpdated = new SelectedValueUpdated(this); 
    } 
} 

SelectedValueUpdated.cs

class SelectedValueUpdated : ICommand 
{ 
    private MenuTreeViewModel _mvModel; 
    public event EventHandler CanExecuteChanged 
    { 
     add { } 
     remove { } 
    } 
    public SelectedValueUpdated(MenuTreeViewModel mvModel) 
    { 
     _mvModel = mvModel; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public void Execute(object parameter) 
    { 
     RoutedPropertyChangedEventArgs<object> e = (RoutedPropertyChangedEventArgs<object>)parameter; 
     if (e.NewValue is Models.MenuTree) 
     { 
      // This is the Top Level Clients item 
      // Nothing needs to be done. 
      // clear out Current items of all Model types 
      // MenuTree tree = (MenuTree)e.NewValue; 

     } 
     if (e.NewValue is Models.Provider) 
     { 
      //MessageBox.Show("Provider"; 
      // Set CurrentProvider to the selected item. 
      Dal db = new Dal(); 
     } 
     if (e.NewValue is Models.Batch) 
     { 
      MessageBox.Show("Batch"); 
     } 
     if (e.NewValue is Models.Consumer) 
     { 
      MessageBox.Show("Consumer"); 
     } 
    } 
} 

UserControlDeclarations

<syncfusion:TreeViewAdv x:Name="treeMain" Width="340" Margin="10,0,0,0"  
     ItemsSource="{Binding Collection, Mode=TwoWay, 
     UpdateSourceTrigger=PropertyChanged}" Grid.ColumnSpan="1" 
            VisualStyle="ShinyBlue" FontFamily="Verdana" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top" VerticalAlignment="Top" 
            HorizontalAlignment="Left" FontSize="11" Height="768" 
            ScrollViewer.VerticalScrollBarVisibility="Auto" Visibility="Visible"> 

    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectedItemChanged"> 
      <cmd:EventToCommand Command="{Binding DataContext.SelectedValueUpdated, Mode=OneWay}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    </syncfusion:TreeViewAdv> 
相关问题