c# - WP8 - 将命令绑定(bind)到列表中的按钮和开关

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

我正在使用 MVVM 模式,并且我的页面中有 LongListSelector 但我不确定如何进行这些绑定(bind):

  • 我希望在每一行中都有一个按钮,该按钮对该行中的对象执行某些操作。我在 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);
    }
    

    我正在尝试像这样绑定(bind)它:
    <Button x:Name="ShowButton" Content="Show" 
                            Command="{Binding GoToTrackingPageCommand}"
                            CommandParameter="{Binding}"/>
    

    它不起作用,因为按钮在数据模板中,并且当绑定(bind)时它转到选定的模块对象而不是 ViewModel。所以我的第一个问题是如何解决它?
  • 我猜第二个有点复杂,但希望两者都能轻松解决。我也想在每一行都有 ToggleSwitch ,当值改变时我想调用 http 请求。我在数据模板中有这个:
    <toolkit:ToggleSwitch x:Name="LockSwitch" IsChecked="{Binding IsLock}" />
    

    我可以将绑定(bind)更改为 TwoWay,但我更改了对象中的值,并且我想使用 Module 参数调用 ViewModel 中的方法。那么我可以更改此绑定(bind)吗?我应该以某种方式从我的对象调用 ViewModel 中的方法吗?或者我应该以某种方式告诉 ViewModel 这个对象已经改变了这个值?或者我应该绑定(bind) Checked 和 Unchecked 事件?
  • 最佳答案

    关于按钮:
    您可以使用 elementName 绑定(bind)访问“父数据上下文”并设置命令参数:

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

    关于你的第二个问题:

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

    WP 执行此操作的一个示例是启用/禁用飞行模式。

    我会这样做:
  • 通过 TwoWayBinding
  • 绑定(bind)到属性
  • 更改属性时,开始更新过程,禁用切换按钮并显示进度指示器。

  • 编辑:这是我最近使用的 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;
        }
    

    关于c# - WP8 - 将命令绑定(bind)到列表中的按钮和开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345882/

    相关文章:

    c# - 从 session 中存储和检索数据表

    c# - Action 和 Func 的代码约定

    c# - 使用静态可见性枚举作为命令参数

    c# - 在 C# 中使用 App Config 文件中的值

    c# - 在Windows Phone上同时播放声音

    c# - 使用 MVVM 包含不同用户控件的 TabControls

    c# - 在 MVVM 中使用 CommandParameter 传递类变量

    sqlite - 如何在SQLite Select语句中正确表达参数

    c# - Windows Phone 8 中的设备方向

    c# - 在 MVVM 中使用 DelegateCommand 的异步 CanExecute 方法