簡體   English   中英

在使用Prism和MVVM方式從另一個選取器中選擇一個項目之后,如何將重點放在選取器上?

[英]How do I set focus on a Picker after selecting an item from another Picker using Prism and the MVVM way?

方案兩個不可見但已啟用的選擇器。 一個用於org.units,另一個用於所選org.unit中的用戶。 當用戶點擊工具欄上的“添加”(加號)時,第一個選擇器將聚焦。 當用戶選擇org.unit時,我需要將重點放在另一個選擇器上。

問題選擇組織單位后,它不會將焦點放在用戶選擇器上。

XAML

<Picker
    x:Name="PickerOrgUnit"
    Title="Select an organization unit"
    IsEnabled="True"
    IsVisible="False"
    ItemDisplayBinding="{Binding OrgUnitName}"
    ItemsSource="{Binding OrgUnits, Mode=TwoWay}"
    SelectedIndexChanged="PickerOrgUnit_SelectedIndexChanged"
    SelectedItem="{Binding SelectedOrgUnit}"
    Style="{StaticResource PagePicker}">
    <Picker.Behaviors>
        <b:EventToCommandBehavior
            Command="{Binding PickerOrgUnitItemChangedCommand}"
            CommandParameter="{x:Reference PickerOrgUnit}"
            EventName="SelectedIndexChanged" />
    </Picker.Behaviors>
</Picker>
<Picker
    x:Name="PickerUser"
    Title="Select a user"
    IsEnabled="True"
    IsVisible="False"
    ItemsSource="{Binding Users, Mode=TwoWay}"
    SelectedIndexChanged="PickerUser_SelectedIndexChanged"
    SelectedItem="{Binding SelectedUser}"
    Style="{StaticResource PagePicker}">
    <Picker.Behaviors>
        <b:EventToCommandBehavior
            Command="{Binding PickerUserItemChangedCommand}"
            CommandParameter="{x:Reference PickerUser}"
            EventName="SelectedIndexChanged" />
    </Picker.Behaviors>
</Picker>

數據模型 (經過簡化以提高可讀性)

public class OrgUnitModel
{
    public int OrgUnitID { get; set; }
    public string OrgUnitName { get; set; }
}

// Users here are handled in a multi-used code, named ListModel
public class ListModel
{
    public int ListID { get; set; }
    public string ListName { get; set; }
}

XAML背后的代碼

private void PickerOrgUnit_SelectedIndexChanged(object sender, System.EventArgs e)
{
    var vm = BindingContext as FYIUsersPageViewModel;  // this is a viemodel which handles a list of users, see below
    if (vm == null) return;
    var vmCommand = vm.PickerOrgUnitChangedCommand;
    if (vmCommand.CanExecute(sender))
        vmCommand.Execute(sender);
}

private void PickerUser_SelectedIndexChanged(object sender, System.EventArgs e)
{
...
}

ViewModel (簡體)

public class FYIUsersPageViewModel : BindableBase, INavigationAware
{
    public DelegateCommand<object> PickerOrgUnitChangedCommand => new DelegateCommand<object>(PickerOrgUnitChangedMethod);
    public DelegateCommand<object> PickerUserChangedCommand => new DelegateCommand<object>(PickerUserChangedMethod);

    private UserModel selectedOrgUnit;
    public UserModel SelectedOrgUnit { get => selectedOrgUnit; set { selectedOrgUnit = value; RaisePropertyChanged("SelectedOrgUnit"); } }

    private UserModel selectedUser;
    public UserModel SelectedUser { get => selectedUser; set { selectedUser = value; RaisePropertyChanged("SelectedUser"); } }

    public ObservableCollection<OrgUnitModel> OrgUnits { get; set; }  // orgunits
    public ObservableCollection<ListModel> Users { get; set; }  // users in an orgunit

    // constructor
    public FYIUsersPageViewModel(INavigationService navigationService)
    {
        NavigationService = navigationService;

        LoadOrgUnits();  // loads all orgunits into OrgUnits from DB
    }

    // code for calling OrgUnit picker, not relevant
    ...
    //

    public void PickerOrgUnitChangedMethod(object obj)
    {
        OrgUnitModel selItem = (OrgUnitModel)((Picker)obj).SelectedItem;
        if (selItem == null)
            return;
        LoadUsers(selItem.OrgUnitID);  // load orgunit users from DB
        Picker picker = (Picker)obj;

        // THIS IS WHAT DOES NOT WORK! Because I call the orgunit picker here, not the user picker... HELP NEEDED HERE!
        Device.BeginInvokeOnMainThread(() =>
        {
            if (picker.IsFocused)
                picker.Unfocus();
            picker.Focus();
        });
        picker.Focus();
    }

    public void PickerUserChangedMethod(object obj)
    {
        // Goal reached, do something with the selected user.
        // BUT I NEVER GET HERE!
    }
}

解決方案:在第一個選擇器(PickerOrgUnit)的SelectedIndexChanged事件中使用此函數:

this.FindByName<Picker>("PickerUser").Focus();

其中“ PickerUser”是第二個選擇器的名稱。

暫無
暫無

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

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