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

C# WP8-将命令绑定到列表中的按钮和开关,c#,windows-phone-8,mvvm,data-binding,windows-phone,C#,Windows Phone 8,Mvvm,Data Binding,Windows Phone,我使用的是MVVM模式,我的页面中有LongListSelector,但我不确定如何进行这些绑定: 我希望在每一行中都有一个按钮,用于处理该行中的对象。我在ViewModel中准备了以下内容: private RelayCommand<Module> goToTrackingPageCommand; public RelayCommand<Module> GoToTrackingPageCommand { get { return go

我使用的是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);
    }
    
    private RelayCommand goToTrackingPageCommand;
    public relay命令GoToTrackingPageCommand
    {
    得到
    {
    返回goToTrackingPageCommand
    ??(goToTrackingPageCommand=新继电器命令(
    导航跟踪页面);
    }
    }
    专用void NavigateToTrackingPage(模块)
    {
    App.Current.SelectedModule=模块;
    navigationService.NavigateTo(新Uri(“/Views/ModuleTrackingPage.xaml”)、UriKind.Relative;
    }
    
    我试着把它绑成这样:

    <Button x:Name="ShowButton" Content="Show" 
                            Command="{Binding GoToTrackingPageCommand}"
                            CommandParameter="{Binding}"/>
    
    
    
    它不起作用,因为按钮在datatemplate中,当有绑定时,它会转到选定的模块对象,但不会转到ViewModel。所以我的第一个问题是我如何修复它

  • 第二个有点复杂,我想,但希望两者都能得到简单的解决方案。我希望在每一行中也有ToggleSwitch,当值更改时,我希望调用http请求。我在datatemplate中有以下内容:

    <toolkit:ToggleSwitch x:Name="LockSwitch" IsChecked="{Binding IsLock}" />
    
    
    
    我可以将绑定更改为双向,但我更改了对象中的值,并希望使用模块参数调用ViewModel中的方法。那么我可以更改这个绑定吗?我是否应该从对象调用ViewModel中的方法?或者我应该告诉ViewModel此对象已更改此值吗?还是应该绑定已检查和未检查的事件

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

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

我不知道如何访问家长。看起来是对的。对于第二个问题:如何从setter开始更新流程?如何在ViewModel中调用方法?多亏了IoC,我在ViewModel中拥有了ApiService类(用于管理api调用)以及如何访问它?我(个人意见)只会从属性设置器中触发一些“OnXyChanged”方法。看起来不错,但还有一件事。当我在VM中找到某个方法(使用父datacontext)时,如何从列表中设置该对象?在按钮中,使用命令参数很容易,但如何使用ToggleSwitch实现这一点?您不需要这样做。使用按钮时,只需将Datacontext作为CommandParameter提供,因为按钮位于列表控件(列表将每个项的Datacontext设置为列表源项)中。由于切换按钮绑定到特定属性,因此不需要提供更多上下文。
    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;
    }