2012-04-20 2 views
0

Хорошо, давайте посмотрим, выполняю ли я это правильно, или я делаю это с трудом.Сложная привязка, преобразующая INT в многократную видимость WPF

Первый. У меня есть уровень учетной записи, который является целым числом (0-255), каждый байт установлен для включения данных функций. Я работаю по настройке видимости в заданном Byte Psudo XML кодекс

<Button Grid.Column="0" Grid.Row="0" Name="Function" Content="Function 1" Visibility="{Binding UserLevel.Allow1 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="1" Name="Function" Content="Function 2" Visibility="{Binding UserLevel.Allow2 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="2" Name="Function" Content="Function 3" Visibility="{Binding UserLevel.Allow3 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="3" Name="Function" Content="Function 4" Visibility="{Binding UserLevel.Allow4 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="4" Name="Function" Content="Function 5" Visibility="{Binding UserLevel.Allow5 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="5" Name="Function" Content="Function 6" Visibility="{Binding UserLevel.Allow6 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="6" Name="Function" Content="Function 7" Visibility="{Binding UserLevel.Allow7 , UpdateSourceTrigger=PropertyChanged}"/> 
<Button Grid.Column="0" Grid.Row="7" Name="Function" Content="Function 8" Visibility="{Binding UserLevel.Allow8 , UpdateSourceTrigger=PropertyChanged}"/> 

Когда знаки пользователя в классе ProgramVar.ActiveUser получает вытащили и установить на текущий подписанном в пользователе с PHP Soap Интерфейс (рабочий)

class ProgramVar : INotifyPropertyChanged 
{ 
    private User _ActiveUser; 
    private Level _UserLevel; 
    public User ActiveUser { get { return this._ActiveUser; } set { _ActiveUser= value; UpdateLevel(); NotifyPropertyChanged("ActiveUser "); } } 
    public Level UserLevel { get { return this._UserLevel; } set { _UserLevel= value; NotifyPropertyChanged("UserLevel"); } } 
    private void UpdateLevel() 
    { 
     UserLevel.Allow1 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 1) UserLevel.Allow1 = Visibility.Visible; 
     UserLevel.Allow2 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 2) UserLevel.Allow2 = Visibility.Visible; 
     UserLevel.Allow3 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 4) UserLevel.Allow3 = Visibility.Visible; 
     UserLevel.Allow4 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 8) UserLevel.Allow4 = Visibility.Visible; 
     UserLevel.Allow5 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 16) UserLevel.Allow5 = Visibility.Visible; 
     UserLevel.Allow6 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 32) UserLevel.Allow6 = Visibility.Visible; 
     UserLevel.Allow7 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 64) UserLevel.Allow7 = Visibility.Visible; 
     UserLevel.Allow8 = Visibility.Collapsed; if(ActiveUser.AccountLevel & 128) UserLevel.Allow8 = Visibility.Visible; 
     NotifyPropertyChanged("UserLevel"); 
    } 
} 
class User 
{ 
    string UserName; 
    string FirstName; 
    int AccountLevel; 
} 
class Level 
{ 
    Visibility Allow1 = Visibility.Visible; 
    Visibility Allow2 = Visibility.Visible; 
    Visibility Allow3 = Visibility.Visible; 
    Visibility Allow4 = Visibility.Visible; 
    Visibility Allow5 = Visibility.Visible; 
    Visibility Allow6 = Visibility.Visible; 
    Visibility Allow7 = Visibility.Visible; 
    Visibility Allow8 = Visibility.Visible; 
} 

Теперь я также читал о IValueConverters, бы использовать текущий метод быть правильный метод, или я должен использовать IValueConverts в XAML & СК Files?

Текущий метод я использую работаю, а когда я пытался использовать IValueConvertes, я не видел, как получить объект для возврата несколько обзорности (или других varables при необходимости)

+0

Если ваша реализация работает, я предполагаю, что использование IValueConverters не будет отличной идеей, так как это осложнит вам жизнь. Вы можете придерживаться этой реализации. Я бы скорее использовал List или ObservableCollection of Visibility как тип и использовал его как visibilityCollection [index]. IValueConverters обычно используются, когда видимость элемента управления или раздела кода зависит от значения другого элемента управления, такого как переключатель или флажок, или может быть другой простой логикой. –

+0

Вам будет сложно реализовать это с вашей логикой, так как ActiveUSer AccountLevel также будет помещен в изображение, и вам нужно будет написать конвертер в вашем ViewModel, а не отдельный класс конвертера, поскольку ваша логика ViewModel входит в преобразование видимости. –

ответ

0

Есть множество вещей, которые вы делаете неправильно ...

  1. Ваши Level.AllowX - это поля, которые не являются объектами недвижимости. WPF ожидает, что свойства будут участвовать в привязках.
  2. После того, как вы преобразовали их в свойства, сеттеры AllowX должны поднять PropertyChangedNotifications (как и в ProgramVar.UserLevel).
  3. У вашего NotifyPropertyChanged("ActiveUser ") есть заднее пространство! он должен быть NotifyPropertyChanged("ActiveUser").
  4. Поскольку вы уже устанавливаете значения Visibility enum, поэтому я не думаю, что в ваших привязках есть необходимость в конвертерах значений.
  5. Хотя в конечном итоге создание 255 AllowLevel полей - плохая идея! Пожалуйста, проверьте, как ItemsControls и ItemsSource работают с List<Visibility> значениями!
Смежные вопросы