带触发器的网格示例:
<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;
}
你可以看到我在我的视图中试图摆脱我的网格中的Loaded =“”,而是做一个RelayCommand。 问题是OriginalSource什么都没带回来。我加载的事件运行得很好,但是我需要通过RoutedEventArgs来获取Grid。
我尝试使用CommandParameter =“{Binding ElementName = LayoutRoot}”在EventCommand中传入Grid,但这只会在击中F5并运行项目时崩溃VS2010。
有什么想法吗?或者更好的方法吗?我在视图C#中运行了Loaded事件,然后在Views代码隐藏中调用ViewModel,但我想做一个更好的绑定。与视图中的ViewMode对话代码隐藏感觉就像一个黑客。
答案 0 :(得分:4)
您可以尝试绑定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;
}
应该可以正常工作:)
再见。