WP8 - 将命令绑定到列表中的按钮和开关

时间:2014-12-07 17:59:30

标签: c# windows-phone-8 mvvm data-binding windows-phone

我正在使用MVVM模式,我的页面中有LongListSelector,但我不知道如何进行这些绑定:

  • 我想在每一行中都有一个按钮,它对该行中的对象执行某些操作。我在ViewModel中做了这个准备:

    private RelayCommand<Module> goToTrackingPageCommand;
    
    public RelayCommand<Module> GoToTrackingPageCommand
    {
        get
        {
            return goToTrackingPageCommand
                ?? (goToTrackingPageCommand = new RelayCommand<Module>(
                     NavigateToTrackingPage));
        }
    }
    
    private void NavigateToTrackingPage(Module module)
    {
        App.Current.SelectedModule = module;
        navigationService.NavigateTo(new Uri("/Views/ModuleTrackingPage.xaml"), UriKind.Relative);
    }
    

    我试图像这样绑定它:

    <Button x:Name="ShowButton" Content="Show" 
                            Command="{Binding GoToTrackingPageCommand}"
                            CommandParameter="{Binding}"/>
    

    它不起作用,因为按钮位于datatemplate中,当有绑定时,它会转到选定的Module对象但不会转到ViewModel。所以我的第一个问题是如何解决它?

  • 第二个问题我觉得很复杂,但希望两者都能轻松解决。我想在每一行中都有ToggleSwitch,当值改变时我想调用http请求。我在datatemplate中有这个:

    <toolkit:ToggleSwitch x:Name="LockSwitch" IsChecked="{Binding IsLock}" />
    

    我可以更改绑定到TwoWay,但我更改了对象中的值,我想在ViewModel中使用Module参数调用方法。我可以更改此绑定吗?我应该从View对象中调用ViewModel中的方法吗?或者我应该以某种方式告诉ViewModel这个对象是否改变了这个值?或者我应该绑定Checked和Unchecked事件吗?

1 个答案:

答案 0 :(得分:2)

关于按钮: 您可以使用elementName绑定访问“parent datacontext”并设置命令参数:

<Button Command="{Binding DataContext.GoToXyCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />

关于你的第二个问题:

首先,我会检查切换按钮是否是正确的解决方案,如果更改值会触发持续时间可能更长的进程。

WP执行此操作的示例是启用/禁用Air-Plane模式。

我会这样做:

  • 通过TwoWayBinding绑定到该物业
  • 更改属性后,启动更新过程,禁用切换按钮并显示进度指示器。

编辑:这是我最近使用的ViewModel的示例。

    public bool IsUpdatingPushEnabled
    {
        get { return _isUpdatingPushEnabled; }
        set { SetProperty(ref _isUpdatingPushEnabled, value); }
    }

    public bool IsPushEnabled
    {
        get { return _isPushEnabled; }
        set
        {
            if (!IsUpdatingPushEnabled)
            {
                SetProperty(ref _isPushEnabled, value);
                var t = SetPushAsync();
            }
        }
    }

    private async Task SetPushAsync()
    {
        IsUpdatingPushEnabled = true;

        try
        {
            var result = await _settingService.EnablePushAsync(IsPushEnabled);
            SetProperty(ref _isPushEnabled, result, "IsPushEnabled");
        }
        catch
        {
            //...
        }

        IsUpdatingPushEnabled = false;
    }