簡體   English   中英

WP8-將命令綁定到列表中的按鈕和開關

[英]WP8 - Binding commands to buttons and switches in list

我正在使用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}"/> 

    它不起作用,因為按鈕在數據模板中,並且在綁定時,它轉到選定的Module對象,而不是ViewModel。 所以我的第一個問題是如何解決?

  • 第二個我不太復雜,但希望兩者都能輕松解決。 我也希望每一行中都有ToggleSwitch,並且當值更改時,我想調用http請求。 我在datatemplate中有這個:

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

    我可以更改對TwoWay的綁定,但是我更改對象中的值,並且想在ViewModel中使用Module參數調用方法。 那么我可以更改此綁定嗎? 我是否應該從對象中調用ViewModel中的方法? 還是應該以某種方式告訴ViewModel該對象已更改此值? 還是應該綁定Checked和Unchecked事件?

關於按鈕:可以使用elementName綁定訪問“父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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM