2016-09-17 29 views
0

我想要實現的是:我想要一個命令在元素被加載時被觸發,並且我想獲得該元素的Refference,所以我可以在MainViewModel.cs綁定事件命令並獲得對UI元素的引用

我的嘗試:

我寫這篇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(); 
         })); 
     } 
    } 

但該方法不會被調用時,加載的事件正在被解僱。

所以,我想這得到REFFERENCE的控制,但它拋出一個NullRefference例外:

MainViewModel

public PreviewTile PreviewTile { get; set; } 

MainPage.xaml.cs

public MainPage() 
    { 

     InitializeComponent();  

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

    } 

儘管有是關於在mvvm燈光中使用事件的一些文章和問題(一些未解答)我無法弄清楚我如何才能使這個工作。

回答

0

我能看到的唯一原因是PageDataContext未正確設置。要在頁面上使用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給你看看。

+0

謝謝你的答案和示例項目 - 它正在工作 - ,idk爲什麼有人低估了這個 –

+0

太棒了,開心的幫助:-) –