将事件绑定到命令并获取UI元素的参考

时间:2016-09-17 17:31:59

标签: c# xaml mvvm uwp mvvm-light

我想要实现的目标:我希望在加载元素时触发Command,并且我希望获得对此元素的Refference,因此我可以在MainViewModel.cs中访问它。

我尝试了什么:

我写了这个xaml代码:

  <visualizer:PreviewTile DisplayName="Share Tile" TileSize="Wide" Background="Red" IsAnimationEnabled="True" x:Name="P">
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="Loaded">
                <core:InvokeCommandAction Command="{Binding LoadedVisualizer}"></core:InvokeCommandAction>
            </core:EventTriggerBehavior>
        </interactivity:Interaction.Behaviors>
    </visualizer:PreviewTile>

并添加了这段代码:

  private RelayCommand _loadedVisualizerCommand;
  public RelayCommand LoadedVisualizer
    {
        get
        {
            return _loadedVisualizerCommand
                   ?? (_loadedVisualizerCommand = new RelayCommand(
                       async () =>
                       {
                          await new MessageDialog("Loaded", "Some Content").ShowAsync();
                       }));
        }
    }

但是当Event Loaded被触发时,方法不会被调用。

所以我尝试了这个以获得对控件的引用,但它抛出了NullRefference异常:

MainViewModel

public PreviewTile PreviewTile { get; set; }

MainPage.xaml.cs

 public MainPage()
    {

        InitializeComponent();      

        Loaded += (s, e) =>
        {
            Vm.PreviewTile = P;
        };

    }

尽管有一些关于在mvvm灯光中使用事件的文章和问题(一些没有答案)我无法弄清楚我是如何让这个工作的。

1 个答案:

答案 0 :(得分:0)

我能看到的唯一原因是Page&#39; s DataContext未正确设置。要使用页面上的MainViewModel,您必须将其添加到ViewModelLocator类中:

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider( () => SimpleIoc.Default );

        SimpleIoc.Default.Register<MainViewModel>();
    }

    public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
}

然后在MainPage上使用它:

<Page ...
DataContext="{Binding Source={StaticResource Locator}, Path=Main}">

现在EventTriggerBehavior应该按预期工作。

我已经为您提供了sample project on my GitHub