2011-04-09 2 views
9

У меня есть этот код:WPF ListViewItem элемент Флажок

<ListView Height="238" 
       HorizontalAlignment="Left" 
       Name="listView1" 
       VerticalAlignment="Top" 
       Width="503" 
       ItemsSource="{Binding}" 
       IsSynchronizedWithCurrentItem="True"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Tag="{Binding ID}"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 

enter image description here

Как узнать, сколько флажок установлен, и получить значение тега каждого установлен флажок?

+0

Можете ли вы быть более подробными из того, что именно вы хотите достичь? –

+0

Я использую флажок для удаления строк, но я не могу установить флажок значения флажка. –

+1

коллекция объектов, привязанных к ListView, имеет идентификатор свойства, связанный с свойством Tag флажка. Вместо этого, булево свойство в этом объекте и связать его с свойством IsChecked флажка. Затем вы можете просто перебрать свою коллекцию в своей модели просмотра и посмотреть, какие элементы были выбраны пользователем. Дополнительные вещи, которые вам нужно позаботиться: 1. Сделайте свой объект реализацией INotifyPropertyChanged. 2. Используйте двустороннюю привязку для флажка. Сообщите нам, если вам нужен образец кода. – publicgk

ответ

5

Это должно быть так же просто, как привязать свойство IsChecked объекта CheckBox к собственности на ViewModel (возможно, вам может понадобиться добавить новое свойство, если оно еще не существует). Затем, после нажатия кнопки, вы просто перебираете все элементы коллекции и удаляете те, которые были отмечены (в зависимости от значения свойства в ViewModel).

8

я знаю, что это старый, но для потомков, если люди стерни на это вот решение

<ListView Height="238" 
       HorizontalAlignment="Left" 
       Name="listView1" 
       VerticalAlignment="Top" 
       Width="503" 
       ItemsSource="{Binding}" 
       IsSynchronizedWithCurrentItem="True" 
       SelectionChanged="listView1_SelectionChanged"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 

затем в коде файла CS это в listView1_SelectionChanged

private List<MyObject> lstMyObject = new List<MyObject>(); 

private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (MyObject item in e.RemovedItems) 
    { 
     lstMyObject.Remove(item); 
    } 

    foreach (MyObject item in e.AddedItems) 
    { 
     lstMyObject.Add(item); 
    } 
} 

lstMyObject должны быть того же типа, как ваш объект, привязанный к списку. и код просто добавит и удалит ссылку на элементы исходного списка в этот список.

Теперь все, что вам нужно сделать, - это перебрать этот список, который будет содержать только выбранные элементы. это работает только для одного выбора, за исключением того, что lstMyObject будет содержать только одну запись.

Смежные вопросы