2017-04-17 23 views
0

リストボックスにチェックボックスを入れようとしています。 XAMLでリストボックスの項目のチェックボックスにアクセスする方法

私が持っている:

<ListBox ItemsSource="{StaticResource ResourceKey=lstMaterialesCL}" SelectionMode="Multiple" Name="lstMaterial" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="chkMaterial" Content="{Binding DescCompuesta}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

と私のListBoxに見えるように:

enter image description here

それはOKですが、私は "Municipales" リストボックス内の項目をチェックすると、それを見てが選択されておらず、リストボックス "インダストリーズ"で選択した場合はチェックされません

リストボックスに選択されたアイテムを調べると、一致しません

foreach (var item in lstMaterial.SelectedItems) 
{ 
    MessageBox.Show(((MaterialesCL)item).DescCompuesta); 
} 

をチェック項目i番目のそれは「Oficiales」、「レオネス・デ・インダストリアレス」と「Destrucciones」私を示していますが、ユーザーは「Municipales」と「Destrucciones」 はどのように私ができると選択のListBox項目を一致させる]を選択しますました。チェックボックスがチェックされている場合はチェックボックスがオンになっていますか?

+0

http://stackoverflow.com/questions/21193242/wpf-checkedlistbox-how-to-get-selected-item –

+0

http://stackoverflow.com/questions/21193242/wpf-checkedlistbox-どのように取得する選択項目 –

+0

これらの投稿を確認してください。あなたがanwserを得ることを望みます。 –

答えて

1

XAML:
DescCompuestaListここCheckListGeneric

<ListBox ItemsSource="{Binding DescCompuestaList}" > 
    <ListBox.ItemTemplate> 
     <HierarchicalDataTemplate> 
      <CheckBox Content="{Binding DescCompuesta}" IsChecked="{Binding IsChecked}"/> 
     </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

のリストは、あなたはすべての単純なクエリ

var selectedItems = DescCompuestaList.Where(x => x.IsChecked)

を使用して選択することができますあなたの CheckListGenericクラス

public class CheckListGeneric: ViewModelBase 
{ 
    #region ..:: Fields ::.. 

    private bool _isChecked; 

    #endregion 

    #region ..:: Properties ::.. 

    public long Id { get; set; } 
    public string DescCompuesta{ get; set; } 

    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set { _isChecked = value; OnPropertyChanged("IsChecked"); } 
    } 

    #endregion 
} 

です0

人生は単純です。

+0

thnksそんなに@CelsoLívero私はあなたの提案をテスト – Cyndy

1

CheckBoxIsCheckedプロパティへのバインディングについては、のIsSelectedプロパティにバインディングはどうですか?あなたの例ではIsChecked={Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}

::のような 何か私にとって

<ListBox ItemsSource="{StaticResource ResourceKey=lstMaterialesCL}" SelectionMode="Multiple" Name="lstMaterial" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="chkMaterial" Content="{Binding DescCompuesta}" IsChecked={Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

thnksそんなに@Bubba私はあなたの提案をテストする – Cyndy

+0

それがあなたを助けるならば、投票して答えを受け入れることを忘れないでください。 – Bubba

1

それは常にテンプレートを作成するためのブレンドを使用する最も簡単な方法です。 プロジェクトを開いて1つのリストボックスを作成し、そのリストボックスを選択して、写真のようなテンプレートを追加します。 enter image description here

私は単純なcheckBoxとTextBlockを追加しています。あなたはそれを好きなように作ることができます。私は、ユーザーに目的とバウンドのItemsSourceを表示するには、単純な観察可能なコレクションを作ったのViewModelに

:あなたが好きなテンプレートを作ることができます

public class TestVM 
    { 
     public ObservableCollection<User> Users { get; set; } 

     public TestVM() 
     { 
      Users = new ObservableCollection<User> 
      { 
       new User{ IsChecked=true, Name="User1" }, 
       new User{ IsChecked=false, Name="User2" }, 
       new User{ IsChecked=true, Name="User3" }, 
       new User{ IsChecked=false, Name="User3" }, 
      }; 
     } 
    } 

    public class User 
    { 
     public bool IsChecked { get; set; } 
     public string Name { get; set; } 
    } 

この方法です。

0

うわー、私はすべてにあなたをとても感謝し、すべてのテストの後、私はそれを必要とするどのように解決策は、多かれ少なかれ、このようなものです、すべてのご提案をテストした:

XAMLの場合:

<StackPanel Orientation="Horizontal"> 
    <ListBox ItemsSource="{Binding MaterialesVM}" SelectionMode="Multiple" 
Name="ListBoxMateriales" Width="300" Height="200" 
HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="IsSelected" Value="{Binding IsChecked, Mode=TwoWay}" /> 
      </Style> 
     </ListBox.ItemContainerStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" 
Content="{Binding DescCompuesta}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <Button Name="btnPrueba" Style="{StaticResource BotonContent}" 
Content="Selected" Width="80" Height="30" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="10,0,0,0" Click="btnPrueba_Click"/> 
    <Button Name="btnLimpia" Style="{StaticResource BotonRechazar}" 
Width="30" Height="30" Click="btnLimpia_Click" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="5,0,0,0" ToolTipService.ToolTip="Limpia Todos"/> 
    <Button Name="btnMarca" Style="{StaticResource BotonAceptar}" 
Width="30" Height="30" Click="btnMarca_Click" HorizontalAlignment="Left" 
VerticalAlignment="Top" 
      Margin="5,0,0,0" ToolTipService.ToolTip="Selecciona Todos"/> 
</StackPanel> 

私がクリックした場所には気にしないこの方法では、項目が選択されますか

やアイテムが選択された参照するには(ListItemのチェックボックスにし、上の)非選択:

// To show the selected items 
private void btnPrueba_Click(object sender, RoutedEventArgs e) 
{ 
    var selectedItems = MaterialesVM.Where(x => x.IsChecked); 
    foreach (var item in selectedItems) 
    { 
     MessageBox.Show(((MaterialesCL)item).DescCompuesta); 
    } 
} 
01非選択すべての項目に

// To select all items 
private void btnMarca_Click(object sender, RoutedEventArgs e) 
{ 
    var Items = ListBoxMateriales.Items; 
    foreach (MaterialesCL item in Items) 
    { 
     item.IsChecked = true; 
    } 
} 

:すべての項目を選択するには

// To un-select all items 
private void btnLimpia_Click(object sender, RoutedEventArgs e) 
{ 
    var Items = ListBoxMateriales.Items; 
    foreach (MaterialesCL item in Items) 
    { 
     item.IsChecked = false; 
    } 
} 

、私のクラスは次のとおりです。

MaterialesCL.cs

public class MaterialesCL : INotifyPropertyChanged 
{ 
    public int Material { get; set; } 
    public string Descripcion { get; set; } 
    public string DescCompuesta { get; set; } 
    private bool _ischecked; 
    public bool IsChecked 
    { 
     get { return _ischecked; } 
     set 
     { 
      _ischecked = value; 
      OnPropertyChanged("IsChecked"); 
     } 
    } 

    #region PropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 

LstMaterialesCL。 CS

public class LstMaterialesCL : ObservableCollection<MaterialesCL>, INotifyPropertyChanged 
{ 
    public LstMaterialesCL() 
    { 
     BasculaEntities _context = new BasculaEntities(); 
     var Query = (from m in _context.Materiales 
         select new { m.Material, m.Descripcion} 
         ).OrderBy(m => m.Material).ToList(); 

     foreach (var item in Query) 
     { 
      this.Add(new MaterialesCL { Material = item.Material, 
       Descripcion = item.Descripcion, DescCompuesta = item.Material.ToString("000") + " - " + item.Descripcion, 
      IsChecked=false}); 
     } 
    } 
} 

と私のUserControl MaterialesVM上LstMaterialesCL

LstMaterialesCL MaterialesVM = new LstMaterialesCL(); 

のインスタンスであり、私が必要とするようにチェックボックスとリストボックスの私のテストは動作します。

皆さんありがとうございました。

enter image description here

関連する問題