2013-02-20 3 views
0

В настоящее время я работаю над рефакторингом старого кода, написанного поверх WPF с C#.Databinding Complex Object Models with WPF

Я в настоящее время имеют составную модель пользователя, которая выглядит следующим образом:

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

В этой модели список разрешений приведен список идентификаторов разрешений, предоставленных Пользователем, на который ссылается модель.

В моем xaml для моего экрана управления пользователями У меня есть список этих моделей, связанных с полем со списком, и когда выбор изменяет выбранный элемент привязан к сетке, содержащей текстовые поля для свойства User и элемента управления Items.

Этот элемент управления заполнен флажками, привязанными ко всем разрешениям в системах при загрузке страницы. Мой вопрос - это лучший способ привязать список разрешений к флажкам в элементе управления элементами?

Код для контроля пунктов выглядит примерно так:

<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 для переноса разрешений.

Однако я хотел бы пойти на шаг дальше и определить Выбираемые ViewModel, который будет общее решение для любых других экранов выбора CheckBox на основе вы можете иметь:

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

Я дам этот снимок, я просто думал, что может быть способ привязать IsSelected к списку пользовательских разрешений легче, чем итерация через DataContext. – Philter

+0

вы можете использовать LinQ для этого. –

+0

Да, но я думал, что может быть способ сделать это в Xaml, который я имел в виду. – Philter