2017-06-16 17 views
-1

私は2つの列のリストビューを持っています。最初の列はチェックボックス、2番目の列はサーバー値です。基本的に、ボタンをクリックした後に、その行に対応するチェックボックスがあるすべてのサーバー名のリストを取得したいとします。これはどのように可能ですか?以下では、サーバーモデルからデータを正常にバインドして、最初の列にチェックボックスを入れることができましたが、私は立ち往生しています。WPF/C#のチェック項目からListView項目のリストを取得する機能はありますか?

MVVMパターンに従っているので、理想的にはこのロジックを処理し、チェックされたサーバー名がいくつかのコレクションに格納された後に渡すビューモデルクラスがあります。

XAMLコード

<ListView ItemsSource="{Binding Servers}" Margin="8,30,10,68"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="90" Header="Select For Sync"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox Tag="{Binding ID}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Width="280" Header="Pad Name" 
          DisplayMemberBinding="{Binding NodeName}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

は「私はこだわっています」と、何正確に問題がありますか? 2列目に何も表示されていませんか? 1行しか追加しませんか? 'Servers'の各データがブール値を持つ場合、チェックボックスがチェックされているかどうかを保存するためにコードを実際に単純化することができます。これを前に行い、必要に応じてサンプルコードを提供できます。 –

+0

@ KeyurPATEL選択したチェックボックスを文字列コレクションに変換します。コレクションの各アイテムは、サーバー列の関連する文字列名です。データは2番目の列に表示されますが、最初の列でチェックされた内容に基づいてそのデータを取得します。 – ryan

+0

前に非常に似たようなことをしましたが、私のコードの一部を答えとして適合させようとします。 –

答えて

0

私は簡単に私が似た何かのために使用する方法を説明します。

まず、カスタムクラスのために、それはこのようなものになります。

public class Server 
{ 
    public int ID { get; set; } 
    public bool isChecked { get; set; }  //or IsSelected maybe? whichever name you want 
    public string NodeName { get; set; } 
} 

をそして、あなたのXAMLのために、あなたは、この使用することができます:あなたが使用

<GridView> 
    <GridViewColumn Width="90" Header="Select For Sync"> 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <CheckBox Tag="{Binding ID}" IsChecked="{Binding isChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
    <GridViewColumn Width="280" Header="Pad Name" DisplayMemberBinding="{Binding NodeName}" /> 
</GridView> 

あなたのコレクション/リストListView(Servers)へのバインドは、上記のデータ型がServerである必要があります。

List<Server> checkedRows = Servers.Where(s => s.isChecked).ToList(); //there, you now have a list of checked rows 

か、名前

をしたい場合は
List<string> nodeNames = Servers.Where(s => s.isChecked).Select(s => s.NodeName).ToList(); 
+0

何らかの理由により、この解決策は機能しません。私はcheckedrowsを出力するコマンドをバインドし、関数は呼び出されますが、リストは何もチェックしなくても空です。 – ryan

+0

isCheckedのサーバオブジェクトで実際のプロパティが変更されない – ryan

+0

バインドされたItemsSourceは、(List Serversまたはそれ以外のものを使用している場合は)実装が見えますか?基本的に 'ObservableCollection ' [ObservableCollection Class](https://msdn.microsoft。com/ja-us/library/ms668604(v = vs.110).aspx)を使用します。 –

0

代わりのCheckedUncheckedイベントを処理する:あなたがチェックボックスと、対応する行にアクセスする必要があるとき、それは同じくらい簡単ですCheckBoxあなたのビューでは、あなたのIEnumerable<T>ServersソースコレクションでタイプTつまり、あなたのServerタイプのブール型プロパティにIsCheckedプロパティをバインドする必要があります。

<ListView ItemsSource="{Binding Servers}" Margin="8,30,10,68"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="90" Header="Select For Sync"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox Tag="{Binding ID}" IsChecked="{Binding IsSelected}"></CheckBox> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Width="280" Header="Pad Name" DisplayMemberBinding="{Binding NodeName}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

あなたは、単にビューモデルクラスのServersコレクション内のレコードを反復処理して、現在選択されている項目を決定するためにプロパティをチェックできます。

var selectedItems = Servers.Where(x => x.IsSelected).ToList(); 
foreach(var selectedItem in selectedItems) 
    ... 
関連する問題