2013-03-18 12 views
9

Mam UserControl z następującym wyzwalacza zdarzeń:EventTrigger nie strzelać do załadowanych razie UserControl

<UserControl x:Class="TestApp.Views.MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     > 

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <i:InvokeCommandAction Command="{Binding OnLoadedCommand}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Jest on ustawiony przez konstruktora UserControl (proszę ignorować ServiceLocator ..this jest po prostu szybki prototyp):

public MyUserControl() 
{ 
    InitializeComponent(); 

    DataContext = ServiceLocator.Current.GetInstance<DirectorySearchViewModel>(); 
} 

moim zdaniem model mam następujący:

public ICommand OnLoadedCommand { get; private set; } 

    public MyUserControl() 
    { 
     OnLoadedCommand = new DelegateCommand(OnLoaded); 
    } 

    public void OnLoaded() 
    { 
    } 

OnLoaded nigdy nie zostaje wywołany. Jeśli zmienię nazwę EventName, aby powiedzieć ..MouseDown, to działa, ale to po prostu nie zadziała dla Loaded

Jestem pewien, że to głupi błąd (przysięgam, że robiłem to już milion razy w przeszłości), ale mogę Wygląda na to, że teraz to jest

+2

WAG tutaj, ale spróbuj ustawić swój DC przed wywołaniem InitializeComponent w konstruktorze. – Will

+0

BINGO. ARGH! Ile razy robię ten sam głupi błąd! Proszę odpowiedzieć jako odpowiedź, więc mogę Ci podziękować :) – blue18hutthutt

Odpowiedz

9
public MyUserControl() 
{ 
    DataContext = ServiceLocator.Current.GetInstance<DirectorySearchViewModel>(); 
    InitializeComponent(); 
} 

Arystokraci.

+0

To zadziałało! Czy możesz powiedzieć, dlaczego tak się dzieje? Dlaczego DataContext trzeba najpierw ustawić? –

+1

@AbdulkarimKanaan Ponieważ ładowane zdarzenie jest wywoływane podczas wywołania InitializeComponent. InitializeComponent * inicjuje okno *. Po zainicjowaniu zostanie wywołane załadowane zdarzenie. Ponieważ ustawiono DataContext * po uruchomieniu * załadowanego zdarzenia, wyzwalacz zdarzenia nie ma nic do wyzwolenia i nie pamięta, że ​​zdarzenie zostało już uruchomione i nie wie, że ma ono być wyzwalane po ustawieniu DataContext. To nie jest tak zaprojektowane. – Will

3

Dla każdego innego, natyka się na to można to zrobić bez kodu za tak:

<UserControl x:Class="TestApp.Views.MyUserControl" 
    ... etc... 
    x:Name="theControl" 
    > 

    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction 
       Command="{Binding ElementName=theControl, Path=OnLoadedCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
+0

Otrzymuję to w czasie wykonywania: "Błąd System.Windows.Data: 40: Błąd ścieżki BindingExpression: Nie znaleziono właściwości" ViewLoadedCommand "w 'obiekcie' '' FooView '(Name =' self ')'. BindingExpression: Path = ViewLoadedCommand; DataItem = 'FooView' (Name = 'self'), elementem target jest 'InvokeCommandAction' (HashCode = 21993383), właściwością target jest 'Command' (type 'ICommand') ". Patrzy na widok, a nie na ViewModel dla właściwości polecenia. – Dai

+1

Ah, wydaje się, że rozwiązaniem jest użycie 'Command =" {Binding ElementName = self, Path = DataContext.ViewLoadedCommand} "- tak więc dodanie" 'DataContext." Do 'Path' działa. – Dai

+0

Ups ... Nie pamiętam nawet odpowiedzi na to pytanie, ale jesteś absolutnie poprawny, z tego typu powiązaniami musisz podać DataContext w ścieżce. Musiałem używać kontroli jako własnego DataContext podczas moich własnych testów. Dziękuję za poprawienie odpowiedzi. –

Powiązane problemy