【问题标题】:Binding MVVM Command to TimePicker control in UWP在 UWP 中将 MVVM 命令绑定到 TimePicker 控件
【发布时间】:2016-07-25 01:31:09
【问题描述】:

我在 XAML 页面上使用 TimePicker 控件并尝试对相应 ViewModel 中的更改做出反应。我将Xaml.InteractivityXaml.Interactivity.Core 命名空间添加到我的页面,以便在调用TimeChanged 事件后使用Behaviors SDK 触发命令。

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

对于我的ViewModel 中的代码,我使用来自Template10ViewModelBaseDelegateCommand

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.

【问题讨论】:

标签: c# xaml mvvm win-universal-app template10


【解决方案1】:

感谢@Archana 的讨论。我找到了解决我的问题的方法。 我现在使用编译绑定x:Bind 直接将事件与ViewModel 中的处理程序连接,而不是使用Binding 连接Command

我更新了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;
}

【讨论】:

    【解决方案2】:

    参考这个link

    EventTriggerBehavior 不支持 TimeChanged 事件。支持的事件是

        Tapped
        PointerPressed  
        Loaded
        DataContextChanged
        Click
        Checked
        Unchecked
        SelectionChanged
        TextChanged
        Toggled
    NavigationCompleted
    

    您必须实现自定义行为以支持 TimeChanged 事件

    这是一个实现自定义行为的链接implement_custom_behaviour

    【讨论】:

    • 这似乎很奇怪,这很难实现 MVVM。
    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2014-06-27
    • 2011-04-04
    • 2018-03-02
    • 2013-01-16
    • 2023-04-03
    相关资源
    最近更新 更多