2013-02-20 50 views
0

我目前正在重構一些使用C#編寫在WPF之上的舊代碼。WPF數據綁定複雜對象模型

我現在有一個看起來像這樣的複合用戶模型:

public class UserModel{ 
    public User User {get; set;} 
    public List<Guid> Permissions {get; set;} 
} 

在這個模型中,權限列表授予由模型所引用的用戶權限ID的列表。

在我的用戶管理界面的xaml中,我列出了綁定到組合框的這些模型,當選擇更改時,所選項綁定到包含用戶屬性和項目控件的文本框的網格。

當頁面加載時,這些項目控件被填充了系統中所有權限綁定的複選框。我的問題是什麼是將權限列表綁定到項目控件中複選框的最佳方式?

的項目控件的代碼看起來是這樣的:

<ScrollViewer Grid.Row="7" Grid.Column="1"> 
    <ItemsControl ItemsSource={Binding}> 
    <ItemsControl.ItemsTemplate> 
     <DataTemplate> 
      <Checkbox Content="{Binding Description}" IsChecked="{Binding IsSelected}"/> 
     </DataTemplate> 
    </ItemsControl.ItemsTemplate> 
</ScrollViewer> 

和權限的集合是此對象的名單:

class SelectedPermission{ 
    public Guid PermissionId {get; set;} 
    public string Description {get; set;} 
    public bool IsSelected {get; set;} 
} 

我最初的想法是要落實在INotifyPropertyChanged的SelectedPermission集合,當我綁定我的用戶時,只需將IsSelected設置爲true,以獲取授予選定用戶的任何權限。但似乎應該有更好的方法。

回答

1

我沒有看到你的方法有什麼問題,你基本上是創建一個ViewModel來包裝權限。

不過,我會走的更遠了一步,並定義一個可選的視圖模型,這將是任何其他基於複選框選擇屏幕一個通用的解決方案,你可能有:

public class Selectable<T>: ViewModelBase //ViewModelBase should Implement NotifyPropertyChanged. 
{ 
    private T _model; 
    public T Model 
    { get { return _model; } 
     set 
     { 
      _model = value; 
      NotifyPropertyChange("Model"); 
     } 
    } 

    private bool _isSelected; 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      _isSelected = value; 
      NotifyPropertyChange("IsSelected"); 
     } 
    } 

} 

然後,你可以這樣做:

public ObservableCollection<Selectable<Permission>> Permissions {get;set; } //etc. 
+0

我會給出一個答案,我只是想,有可能比迭代DataContext更容易將IsSelected綁定到用戶權限列表。 – Philter 2013-02-20 14:40:55

+0

你可以使用LinQ。 – 2013-02-20 14:43:02

+0

是的,但我認爲可能有一種方法可以在Xaml中實現。 – Philter 2013-02-20 14:48:47