2012-04-20 75 views
0

好吧,讓我看看我是否正確地做這件事,或者我是否這麼做是困難的。複雜的綁定將INT轉換爲多個WPF可見性

首先。 我有一個帳戶級別是一個整數(0-255)每個字節設置爲啓用給定的功能。 我在能見度設置爲給定的字節 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肥皂在用戶簽訂的電流接口(工作)

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,將使用當前的方法是正確的方法,或者我應該在XAML &的CS文件使用IValueConverts?

我使用的是工作,因爲當我試圖用IValueConvertes當前的方法,我沒有看到如何讓一個對象返回多個典型能見度(或其他varables如果需要的話)

+0

如果你的實現工作,我想使用IValueConverters不會是一個好主意,因爲它會讓你的事情變得複雜。你可以堅持這個實現。我寧願將可見性的List或ObservableCollection用作類型,並使用它像visibilityCollection [index]。 IValueConverters通常用於控件或代碼段的可見性取決於另一個控件(如單選按鈕或複選框)的值,或者可能是其他一些簡單的邏輯。 – 2012-04-20 06:47:05

+0

你很難用你的邏輯來實現這一點,因爲ActiveUSer AccountLevel也被納入圖片中,並且你需要在你的ViewModel中編寫轉換器,而不是你的ViewModel邏輯在可見性轉換中使用的單獨轉換器類。 – 2012-04-20 06:47:41

回答

0

有一套你做錯的事...

  1. 你的Level.AllowX是領域沒有屬性。 WPF期望屬性參與綁定。
  2. 在將它們轉換爲屬性後,AllowX設置者應該提高PropertyChangedNotifications(就像在ProgramVar.UserLevel中一樣)。
  3. 您的NotifyPropertyChanged("ActiveUser ")有尾隨空間!它應該是NotifyPropertyChanged("ActiveUser")
  4. 由於您已經設置Visibility枚舉值,所以我不認爲你的綁定中有任何需要值轉換器。
  5. 儘管最終創建255 AllowLevel字段是個壞主意!請查看ItemsControlsItemsSource如何使用List<Visibility>值!