2017-04-06 4 views
0

私はWPFアプリケーションで作業しています。ユーザーがいて、私のケースではSUPERADMINとADMINのロール1つのユーザーが1つ以上のロールを持つことができます。これは、自分のフォームで1つ以上のチェックボックスを選択できることを意味します。私はdinamicallyチェックボックスを生成:DataGridで動的に作成されたチェックボックスによって表されるユーザーのロールをマークする方法が変更されました

をそれはは下の方法を適用した後に次のようになりますので、私は向きが垂直であるスタックパネルにチェックボックスを追加している:今、私は疑問に思って

enter image description here

private void LoadRolesToStackPanel() 
{ 
    try 
    { 
     var roles = RolesController.Instance.SelectAll(); 

     if (roles.Count > 0) 
     { 
      foreach (Role r in roles) 
      { 
       CheckBox cb = new CheckBox(); 

       //cb.Name = r.RoleId.ToString(); 

       cb.Content = r.Title.ToString(); 
       cb.FontSize = 15; 
       stackRole.Children.Add(cb); 
      } 
     } 


    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

私は別のユーザーを選択しているときに、各ユーザーの適切なチェックボックスをどのように表示/マーク/チェックすることができますか(ユーザーはDataGrid dtgUsersに含まれているので、ユーザーからユーザーに選択を変更するときにdtgUsers_SelectionChangedイベントを発生させます。それをやっている私はまたshにする必要がある適切なチェックボックスをロールの表現として使用し、選択されたユーザがその(選択された)ロールを有する表現としてチェックされなければならない。

今私はこのようにしましたが、それは非常に悪いアプローチだと思いますので、これを行うための新しい、あるいはより良い解決策を求めています。

private void dtgUsers_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 

    if (dtgUsers.SelectedItem != null) 
    { 
     stackRole.Children.Clear(); 

     User user = (User)(dtgUsers.SelectedItem); 

     if (user != null) 
     { 
      //Get all roles from database for selected user 

      user.Roles = RolesController.SelectByUserId(user.Id); 

      if (user.Roles.Count > 0) 
      { 
       //This is bad approach I took Title of each user's role to compare it with all existing roles 
       var roleNames = user.Roles.Select(r => r.Title); 

       var allRoles = RolesController.SelectAll(); 

       if (allRoles.Count > 0) 
       { 
        foreach (Role r in allRoles) 
        { 
         CheckBox cb = new CheckBox(); 

         cb.Content = r.Title.ToString(); 
         cb.FontSize = 15; 
         cb.Tag = r; 
         stackRole.Children.Add(cb); 

         if (roleNames.Contains(cb.Content)) //Here I'm bassically as I am creating checkbox immediatelly checking/marking it if it exist in user's roles 
          cb.IsChecked = true; 
        } 
       } 

     } 
    } 
} 

私はこの問題を解決する方法を提案任意の種類が/それを改善するには、非常に歓迎です! みんなありがとう 乾杯

答えて

1

私はあなたがこの使用してベストプラクティスを行いたい場合は、MVVMデザインパターンをチェックアウトする必要があります前の回答であなたに言ったよう:

How to store ID from database object, to a checkbox in code behind WPF

その後、あなたは、単に結合することができますロールはDataGridで現在選択されているユーザーに表示されItemsControl

<ItemsControl ItemsSource="{Binding SelectedItem.Roles, ElementName=dtgUsers}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Title}" FontSize="15" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

役割のリストは、その後のuになりますDataGridの項目を選択すると自動的にpdateされます。

+0

私はすぐに実装しようとしますが、あなたのコードを見て、どのように選択された役割をループすることができないのか分かりませんでしたか?私は前の回答では、コードのこの作品を見た:foreachの(_viewModel.Roles中のvar役割) { 場合(role.IsSelected) { // ...} }そして、これはすべての役割throughtループを意味しますが何かをします役割が選択されている場合のみ –

+0

はい、正確です。 IsCelectedプロパティをIsSelectedプロパティにバインドしている場合、CheckBoxをチェックすると、ロールのIsSelectedプロパティがtrueに設定されます。 – mm8

関連する問題