2016-04-05 18 views
1

Ich verwende ein TimePicker Steuerelement auf einer XAML-Seite und versuchen, auf Änderungen in der entsprechenden ViewModel reagieren. Ich habe den Namespace Xaml.Interactivity und Xaml.Interactivity.Core zu meiner Seite hinzugefügt, um die Behaviors SDK zu verwenden, um den Befehl auszulösen, sobald das Ereignis TimeChanged aufgerufen wird.Bindung von MVVM-Befehl an TimePicker-Steuerelement in UWP

<!-- XAML Namespaces --> 
xmlns:interact="using:Microsoft.Xaml.Interactivity" 
xmlns:interactcore="using:Microsoft.Xaml.Interactions.Core" 

<TimePicker x:Name="TestTimePicker" ClockIdentifier="24HourClock" Time="0"> 
    <interact:Interaction.Behaviors> 
     <interactcore:EventTriggerBehavior EventName="TimeChanged"> 
      <interactcore:InvokeCommandAction Command="{Binding DataContext.TimeChangedCommand}" CommandParameter="{Binding ElementName=TestTimePicker, Path=Time}" /> 
     </interactcore:EventTriggerBehavior> 
    </interact:Interaction.Behaviors> 
</TimePicker> 

Für den Code in meinem ViewModel verwende ich ViewModelBase und DelegateCommand von Template10.

public DelegateCommand<TimeSpan> StartTimeChangedCommand { get; set; } 

public TestViewModel() 
{ 
    ... 
    TimeChangedCommand = new DelegateCommand<TimeSpan>(TimeChangedAction); 
    ... 
} 

private void TimeChangedAction(TimeSpan obj) 
{ 
    //do something with obj 
} 

Sobald die Seite ein InvalidOperationException mit der folgenden Meldung geworfen wird initialisiert.

Adding or removing event handlers dynamically is not supported on WinRT events. 
+0

können Sie sagen, was ist das Problem jetzt zu implementieren? – Archana

+0

Entschuldigung! Frage aktualisiert – nor0x

+0

Nein, nicht mit Prisma – nor0x

Antwort

2

Vielen Dank für die Diskussion @Archana. Ich habe einen Workaround für mein Problem gefunden. Anstatt Binding mit Command im ViewModel zu verbinden, verwende ich jetzt kompilierte Bindung x:Bind, um das Ereignis direkt mit einem Handler in ViewModel zu verbinden.

ich die TimePicker Kontrolle

aktualisiert
<TimePicker x:Name="TestTimePicker" ClockIdentifier="24HourClock" Time="{x:Bind ViewModel.TestTime, Mode=TwoWay}" TimeChanged="{x:Bind ViewModel.TestTimeChangedEvent}" /> 

Und den Code in der ViewModel

public void TestTimeChangedEvent (object sender, TimePickerValueChangedEventArgs e) 
{ 
    TestTime = e.NewTime; 
} 
1

dieses Siehe link

EventTriggerBehavior doesnt Unterstützung TimeChanged Ereignis. Unterstützte Ereignisse sind

Tapped 
    PointerPressed 
    Loaded 
    DataContextChanged 
    Click 
    Checked 
    Unchecked 
    SelectionChanged 
    TextChanged 
    Toggled 
NavigationCompleted 

Sie haben individuelle Verhalten zu implementieren TimeChanged Ereignisse

zu unterstützen und hier ist ein Link individuelles Verhalten implement_custom_behaviour