2017-04-06 11 views
0

私はWPFアプリケーションで作業していますが、私はユーザーを持っていますが、私のケースではSUPERADMINとADMINの役割があります。私はその後データベースオブジェクトのIDをコードのチェックボックスに格納する方法

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); 
    } 
} 

を:それは、1つまたは複数のチェックボックスを意味してテーブル「ロール」に保存され、一つのユーザーは、私がこのように動的に生成された私のフォームのチェックボックスで選択することができ、1または複数の役割を持つことができます私はチェックコンボボックスからIDを取得する必要があります。役割を正確に表しているため、対応するRoleIdでデータベースに挿入する必要があります。

イベントSaveUser上のチェックボックス:

IEnumerable<CheckBox> selectedBoxes = 
     from checkbox in this.stackRole.Children.OfType<CheckBox>() 
     where checkbox.IsChecked.Value 
     select checkbox; 

foreach (CheckBox box in selectedBoxes) 
{ 
// do something 
} 

私が

cb.Content = r.Title.ToString(); 

を言ったので、私はコンボボックスからタイトルを取得することができ気づくことが可能である。しかし、私は「R」のIDが必要として - も役割を、私は「ドンタイトルを追加したときにチェックボックスに追加する方法を知っています。

答えて

1

「正しい」方法は、あなたがIEnumerable<Role>にバインドItemsControlを使用することです:

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

public partial class MainWindow : Window 
{ 
    private readonly ViewModel _viewModel = new ViewModel(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = _viewModel; 
    } 
} 

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Roles = RolesController.Instance.SelectAll(); 
    } 

    public List<Role> Roles { get; private set; } 
} 

これは、あなたがRoleIsCheckedプロパティを追加する必要があることを意味し(または、このプロパティを持つ新しいクライアントアプリケーション固有のRoleクラスを作成し、現在のRoleクラスの代わりにこのクラスを使用します)。

あなたは、ビューのコードビハインドまたはビューモデルのいずれかで、選択したロールを反復処理できます。

foreach (var role in _viewModel.Roles) 
{ 
    if(role.IsSelected) 
    { 
     //... 
    } 
} 

この溶液をから推奨デザインパターンであるMVVMの上に構築されていますXAMLベースのユーザーインターフェイスアプリケーションを開発するときに使用します。あなたはそれを学ぶべきです。ここで詳しく読むことができます:https://msdn.microsoft.com/en-us/library/hh848246.aspx

+0

@私の友人私はこのソリューションをすぐに適用しようとします:)あなたの答えはThxです。 –

0

この質問に1時間ほど答えなかったので、何か解決策を見つけたので自分で回答を投稿するのは大丈夫だと思うが、それは良いのか分からない。箱彼らはacctuallyこのような何かを行うことが可能であるデータベース(役割)から生成されるため:

private void LoadRolesToStackPanel() 
{ 
    try 
    { 
     var roles = RolesController.Instance.SelectAll(); 
     if (roles.Count > 0) 
     { 
      foreach (Role r in roles) 
      { 
       CheckBox cb = new CheckBox(); 

       cb.Tag = r; 

       cb.Content = r.Title.ToString(); 
       cb.FontSize = 15; 
       stackRole.Children.Add(cb); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

foreach (CheckBox box in selectedBoxes) 
{ 
    Role r = (Role)box.Tag; 
    //Here we get Id and every other Property that Role had 
    var x = r.Id; 
} 

だから私は.TAGプロパティを含めてDBからそのタグに実際のオブジェクトを割り当てたので、私は、後で簡単にアクセスすることができました選択したチェックボックスからのそのDBオブジェクトのプロパティ!

初めて私はこの男の "Tag"を見ていますが、これはすばらしいことです。私たちに説明するために "Tag"の大きな経験を持つ人を喜んでいます。なぜこれがこのように機能するのですか? .Tagプロパティで。これを解決する

関連する問題