如何通过EventToCommand将LayoutRoot发送到RelayCommand中?
作者:互联网
带有触发器的网格示例:
<Grid x:Name="LayoutRoot" DataContext="{Binding ProjectGrid, Source={StaticResource Locator}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
在我的ViewModel中,我像这样设置LoadedCommand:
public RelayCommand<RoutedEventArgs> LoadedCommand {get;private set;}
在ViewModel初始化程序中,我有这个:
public ProjectGridViewModel()
{
LoadedCommand = new RelayCommand<RoutedEventArgs>(e =>
{
this.DoLoaded(e);
}
);
}
然后,在我的DoLoaded中,我试图这样做:
Grid _projectGrid = null;
public void DoLoaded(RoutedEventArgs e)
{
_projectGrid = e.OriginalSource as Grid;
}
您可以在视图中看到我正在尝试摆脱Grid中的Loaded =“”,而改为执行RelayCommand.问题是OriginalSource没有带回任何东西.我的加载事件以这种方式很好地运行,但是我似乎需要通过RoutedEventArgs来获取Grid.
我尝试使用CommandParameter =“ {Binding ElementName = LayoutRoot}”在EventCommand中传递网格,但是在按F5键并运行项目时,这只会使VS2010崩溃.
有任何想法吗?还是更好的方法呢?我在视图C#中运行了Loaded事件,然后在“视图”代码背后调用了ViewModel,但是我想做一个更好的绑定.与后面的Views代码中的ViewMode对话感觉就像是黑客.
解决方法:
您可以尝试绑定EventToCommand的CommandParameter:
<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=LayoutRoot}" PassEventArgsToCommand="True"/>
然后,您的代码将是:
public RelayCommand<UIElement> LoadedCommand {get;private set;}
public ProjectGridViewModel()
{
LoadedCommand = new RelayCommand<UIElement>(e =>
{
this.DoLoaded(e);
}
);
}
Grid _projectGrid = null;
public void DoLoaded(UIElement e)
{
_projectGrid = e;
}
它应该可以正常工作:)
再见
标签:mvvm-light,relaycommand,c 来源: https://codeday.me/bug/20191106/1999837.html