2017-06-16 73 views
-1

我有兩列的列表視圖。第一列是複選框,第二列是服務器值。我想從本質上得到一個列表,在點擊一個按鈕後,在該行有相應的複選框。這怎麼可能?在下面,我能夠從我的服務器模型中成功綁定數據,並在第一列中放入了一個複選框,但我被卡住了。能夠從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

「但我堅持」,是什麼問題到底是什麼?第二欄中沒有顯示任何內容嗎?它只添加一行嗎?如果'Servers'中的每個數據都有一個布爾值,用於存儲是否選中該複選框,我之前完成了此操作,並且可以根據需要提供一些示例代碼,那麼您的代碼實際上可以被簡化。 –

+0

@KeyurPATEL我想將選中的複選框轉換爲字符串集合,其中集合中的每個項目都是服務器列中的關聯字符串名稱。數據顯示在第二列中,但我想根據第一列中檢查的內容獲取這些數據。 – 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/en-us/library/ms668604(v = vs.110).aspx)而不是列表。 –

0

而不是處理的的CheckedUnchecked事件:每當你需要訪問檢查框和相應的行,它就是這麼簡單CheckBox在您看來,您應該將IsChecked屬性綁定到您的Server類型的布爾屬性,即您的IEnumerable<T>Servers源類型中的T類型:

<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) 
    ...