1

TimePickerXAML ページでコントロールを使用しており、対応する の変更に反応しようとしていますViewModel。イベントが呼び出されたときに を使用してコマンドをトリガーするために、名前空間をページに追加しましたXaml.InteractivityXaml.Interactivity.CoreBehaviors SDKTimeChanged

<!-- 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>

私のコードでは、私はとfromViewModelを使用しています。ViewModelBaseDelegateCommandTemplate10

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

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

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

ページが初期化されるInvalidOperationExceptionと、次のメッセージがスローされます。

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

2 に答える 2

3

ディスカッション@Archanaに感謝します。問題の回避策を見つけました。Bindingでに接続するために使用する代わりに、CommandコンパイルViewModel済みバインディングを使用x:Bindして、 のハンドラーにイベントを直接接続していViewModelます。

TimePickerコントロールを更新しました

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

そして、ViewModel

public void TestTimeChangedEvent (object sender, TimePickerValueChangedEventArgs e)
{
    TestTime = e.NewTime;
}
于 2016-04-05T10:08:30.110 に答える