其他分享
首页 > 其他分享> > 如何通过EventToCommand将LayoutRoot发送到RelayCommand中?

如何通过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