Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM Light EventToCommand-无法获取要触发的evnt_C#_Wpf_Mvvm - Fatal编程技术网

C# MVVM Light EventToCommand-无法获取要触发的evnt

C# MVVM Light EventToCommand-无法获取要触发的evnt,c#,wpf,mvvm,C#,Wpf,Mvvm,我已经阅读了论坛上为EventToCommand提供的所有答案,无法触发我的事件。下面是构成我的问题的代码片段。我正在使用Visual Studio 2015社区版 用户控件声明: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:cmd="http://www.galasoft.ch/mvvmlight" <UserControl.DataC

我已经阅读了论坛上为EventToCommand提供的所有答案,无法触发我的事件。下面是构成我的问题的代码片段。我正在使用Visual Studio 2015社区版

用户控件声明:

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>
xmlns:i=“clr命名空间:System.Windows.Interactivity;assembly=System.Windows.Interactivity”
xmlns:cmd=”http://www.galasoft.ch/mvvmlight"
我的ViewModel逻辑:

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");
            }
        }
    }
public void SelectedItemChanged(对象发送方,
RoutedPropertyChangedEventArgs(e)
{
if(例如,NewValue是Models.MenuTree)
{
//这是顶级客户端项
//什么都不用做。
//清除所有模型类型的当前项
//MenuTree tree=(MenuTree)e.NewValue;
}
如果(例如,NewValue是Models.Provider)
{
//MessageBox.Show(“提供者”;
//将CurrentProvider设置为所选项目。
Dal db=新的Dal();
}
如果(例如,NewValue是Models.Batch)
{
MessageBox.Show(“批处理”);
}
if(例如,NewValue是Models.Consumer)
{
MessageBox.Show(“消费者”);
}
}
}
我知道我一定错过了什么。有人能帮忙吗

多谢各位

Dave K

@Rachel是对的

您正在使用MvvmLight,因此请使用内置的relay命令。将其放入视图模型中,并绑定到公共属性MyCommand或您将其重命名为的任何内容

public RelayCommand MyCommand 
{ 
  get; 
  private set; 
} 

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

private void ExecuteMyCommand() 
{ 
  // Do something 
}
您需要进行一些阅读以确保理解这一点,因为您不应该在MVVM中对VM相关函数使用控制事件


看看

您不能使用EventToCommand调用方法,属性应该是命令

您可以尝试以下方法使其工作

MenuTreeViewModel.cs

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

     public MenuTreeViewModel()
     {
          SelectedValueUpdated = new SelectedValueUpdated(this);
     }
}
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");
        }
    }
}
    <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>
SelectedValueUpdated.cs

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

     public MenuTreeViewModel()
     {
          SelectedValueUpdated = new SelectedValueUpdated(this);
     }
}
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");
        }
    }
}
    <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>
class SelectedValueUpdated:ICommand
{
私有菜单视图模型(mvModel);
公共事件事件处理程序CanExecuteChanged
{
添加{}
删除{}
}
公共选择值更新(MenuTreeViewModel mvModel)
{
_mvModel=mvModel;
}
公共布尔CanExecute(对象参数)
{
返回true;
}
public void Execute(对象参数)
{
RoutedPropertyChangedEventArgs e=(RoutedPropertyChangedEventArgs)参数;
if(例如,NewValue是Models.MenuTree)
{
//这是顶级客户端项
//什么都不用做。
//清除所有模型类型的当前项
//MenuTree tree=(MenuTree)e.NewValue;
}
如果(例如,NewValue是Models.Provider)
{
//MessageBox.Show(“提供者”;
//将CurrentProvider设置为所选项目。
Dal db=新的Dal();
}
如果(例如,NewValue是Models.Batch)
{
MessageBox.Show(“批处理”);
}
if(例如,NewValue是Models.Consumer)
{
MessageBox.Show(“消费者”);
}
}
}
用户控制声明

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

     public MenuTreeViewModel()
     {
          SelectedValueUpdated = new SelectedValueUpdated(this);
     }
}
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");
        }
    }
}
    <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>


默认情况下,我认为您无法绑定到这样的方法……您需要一个运行您的方法的
ICommand
。就像@Rachel所说的,您只能绑定一个
ICommand
。因此,该命令名为event to command。