in WPF puoi legare le proprietà dei controlli a delle proprietà della tua classe (ma la classe con le proprietà che vuoi legare ai controlli deve implementare l'interfaccia INotifyPropertyChanged)
Immagina di avere una classe USER tipo la seguente con relativo ROLE
public class User
{
public string Name { get; set; }
public UserRoleEnum Role { get; set; }
public User()
{
Name = string.Empty;
Role = UserRoleEnum.Guest;
}
}
public enum UserRoleEnum
{
Guest = 0,
Admin = 1
}
poi per renderla semplice, immaginiamo di implementare nel main windows l'interfaccia INotifyPropertyChanged e di gestire sempre in questa classe l'utente corrente, creando 2 pulsanti per definire l'account locale (immaginiamo che recuperino il dato da un db)
public partial class MainWindow : Window, INotifyPropertyChanged
{
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private User _currentUser { get; set; }
public User CurrentUser {
get { return _currentUser; }
set { _currentUser = value;
NotifyPropertyChanged("CurrentUser");
}
}
public MainWindow()
{
InitializeComponent();
CurrentUser = new User() { Name="GuestUser"};
}
private void LoadAdminButton(object sender, RoutedEventArgs e)
{
CurrentUser = new User() { Name = "AdminUser", Role = UserRoleEnum.Admin };
}
private void LoadGuestButton(object sender, RoutedEventArgs e)
{
CurrentUser = new User() { Name = "GuestUser", Role = UserRoleEnum.Guest };
}
}
Ora nella UI prepariamo 2 pulsanti per richiamare le due funzioni e 2 etichette.
Una dovrà essere visibile SOLO quando l'utente corrente è ADMIN, l'altra sempre.
<Button Grid.Column="1" Grid.Row="1" Content="Load Admin User" Click="LoadAdminButton" />
<Button Grid.Column="1" Grid.Row="3" Content="Load Guest User" Click="LoadGuestButton" />
<Label Grid.Column="3" Grid.Row="1" Content=" Only Admin Label"
DataContext="{Binding ElementName=myWindow}"
Visibility="{Binding Path=CurrentUser.Role, Converter={converter:UserRoleToVisibilityConverter}}"/>
<Label Grid.Column="3" Grid.Row="3" Content=" Guest and Admin Label" />
la visualizzazione condizionale viene otteunta nella label "Only Admin Label" impostando il datacontext (riferendolo alla mainwindow)
e la visibility si lega all'oggetto CurrentUser.Role. Il converter serve a convertire l'enum UserRole nella proprietà visibility e questo è implementato nella classe seguente
public class UserRoleToVisibilityConverter : BaseValueConverter<UserRoleToVisibilityConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch ((UserRoleEnum)value)
{
case UserRoleEnum.Guest:
return Visibility.Hidden;
case UserRoleEnum.Admin:
return Visibility.Visible;
default:
return Visibility.Hidden;
}
}
public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
A sua volta l'oggetto BaseConverter è una classe astratta che implementa le funzioni che servono al convertitore
public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter
where T : class, new()
{
private static T Converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Converter ?? (Converter = new T());
}
public abstract object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
public abstract object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
}
Perdona la spiegazione, è più complicato a vedersi che a farsi
fammi sapere se ti è d'aiuto.
Maurizio
Modificato da Maury07 il 11 febbraio 2022 16:20 -