0

私は現在、C# を使用して 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;}
 }

私の最初の考えは、SelectedPermission コレクションに INotifyPropertyChanged を実装することでした。ユーザーをバインドするときに、選択したユーザーに付与されているアクセス許可に対して IsSelected を true に設定するだけです。しかし、もっと良い方法があるはずです。

4

1 に答える 1

1

あなたのアプローチに問題はありません。基本的に、アクセス許可をラップする ViewModel を作成しています。

ただし、さらに一歩進んで、Selectable 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.
于 2013-02-20T03:41:40.067 に答える