You could try using a Behavior instead. I created some simple code you can look through:
public class Permission
{
private List roles = new List();
public List Roles
{
get { return roles; }
set { roles = value; }
}
}
public class PermissionBehavior
{
// Static behaviour parameters
public static readonly Dictionary Instances = new Dictionary();
public static readonly DependencyProperty PermissionProperty =
DependencyProperty.RegisterAttached("Permission", typeof(Permission), typeof(PermissionBehavior),
new PropertyMetadata(OnPermissionPropertyChanged));
public static readonly DependencyProperty RoleProperty =
DependencyProperty.RegisterAttached("Role", typeof(string), typeof(PermissionBehavior),
new PropertyMetadata(OnRolePropertyChanged));
private static void OnPermissionPropertyChanged(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
SetPermission(dependencyObject, (Permission) e.NewValue);
}
public static void SetPermission(DependencyObject obj, Permission value)
{
var behavior = GetAttachedBehavior(obj as FrameworkElement);
behavior.AssociatedObject = obj as FrameworkElement;
obj.SetValue(PermissionProperty, value);
behavior.CurrentPermission = value;
behavior.UpdateVisibility();
}
public static object GetPermission(DependencyObject obj)
{
return obj.GetValue(PermissionProperty);
}
private static void OnRolePropertyChanged(DependencyObject dependencyObject,
DependencyPropertyChangedEventArgs e)
{
SetRole(dependencyObject, (string) e.NewValue);
}
public static void SetRole(DependencyObject obj, string value)
{
var behavior = GetAttachedBehavior(obj as FrameworkElement);
behavior.AssociatedObject = obj as FrameworkElement;
obj.SetValue(RoleProperty, value);
behavior.RoleList = value.Split(',').ToList();
behavior.UpdateVisibility();
}
public static object GetRole(DependencyObject obj)
{
return obj.GetValue(RoleProperty);
}
private static PermissionBehavior GetAttachedBehavior(FrameworkElement obj)
{
if (!Instances.ContainsKey(obj))
{
Instances[obj] = new PermissionBehavior { AssociatedObject = obj };
}
return Instances[obj];
}
static PermissionBehavior()
{
}
// Class instance parameters
private FrameworkElement AssociatedObject { get; set; }
private Permission CurrentPermission { get; set; }
private List RoleList { get; set; }
private void UpdateVisibility()
{
if(RoleList == null || CurrentPermission == null)
return;
if (RoleList.Intersect(CurrentPermission.Roles).Any())
{
AssociatedObject.Visibility = Visibility.Visible;
AssociatedObject.IsEnabled = true;
}
else
{
AssociatedObject.Visibility = Visibility.Hidden;
AssociatedObject.IsEnabled = false;
}
}
}
XAML
Code
public partial class MainWindow : Window, INotifyPropertyChanged
{
private Permission userPermission;
public Permission UserPermission
{
get { return userPermission; }
set
{
userPermission = value;
OnPropertyChanged("UserPermission");
}
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
UserPermission = new Permission {Roles = new List{"Admin","DumbUser"}};
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var p = new Permission();
p.Roles = new List {"User", "Supervisor"};
UserPermission = p;
}
}
It's trivial to change my Permission object and logic with what you use, I would think.