![](/img/trans.png)
[英]How to hide a single element in a picker in Xamarin Forms MVVM Prism?
[英]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.