C# MVVM Light EventToCommand-无法获取要触发的evnt
我已经阅读了论坛上为EventToCommand提供的所有答案,无法触发我的事件。下面是构成我的问题的代码片段。我正在使用Visual Studio 2015社区版 用户控件声明: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
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。