我想要实现的目标:我希望在加载元素时触发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灯光中使用事件的文章和问题(一些没有答案)我无法弄清楚我是如何让这个工作的。
答案 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。