Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > В ListView есть checkbox'ы


Автор: ДобренькийПапаша 4.7.2011, 10:30
Есть вот такой ListView. В каждой строке в первом столбце есть checkBox и textblock. Как сделать так, чтобы из всех строк только один чекбокс мог бы быть помеченным? К чему бы такому привязать? Или придётся всё-таки делать недекларативно?
Код

<ListView Name="lvTariffs"
                      Grid.Row="1"
                      Style="{StaticResource FAcceptedMoneyListView}"
                      ItemsSource="{Binding TariffsList }">
                <ListView.View>
                    <GridView>
                        <GridView.Columns>
                            <GridViewColumn Width="120" Header="Дата создания">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <CheckBox VerticalAlignment="Center" Margin="0,0,3,0"></CheckBox>
                                            <TextBlock Text="{Binding Path=CreationDate}"></TextBlock>
                                        </StackPanel>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Width="260" Header="Дорога" DisplayMemberBinding="{Binding Path=RailName}"/>
                            <GridViewColumn Width="260" Header="Направление" DisplayMemberBinding="{Binding Path=ServerName}"/>
                            <GridViewColumn Width="320" Header="Имя файла" DisplayMemberBinding="{Binding Path=Name}"/>
                        </GridView.Columns>
                    </GridView>
                </ListView.View>
            </ListView>

Автор: Rohoss 4.7.2011, 15:45
Наверное, если ты хочешь только декоративно, то так не получится. однако, такой кейс легко реализуется через MVVM. 

Автор: ДобренькийПапаша 4.7.2011, 15:52
Цитата(Rohoss @  4.7.2011,  15:45 Найти цитируемый пост)
Наверное, если ты хочешь только декоративно, то так не получится. однако, такой кейс легко реализуется через MVVM.


Хорошо, согласен на код. Подскажи как реализовать smile
С MVVM пока не дружу, но это пока (очень надеюсь в течение пары месяцев разобраться smile )

Автор: ДобренькийПапаша 6.7.2011, 08:04
Ну так что, кто подскажет как покрасивше организовать код, отлавливающей проставку галок?)))

Автор: Rohoss 6.7.2011, 09:48
Цитата(ДобренькийПапаша @  6.7.2011,  08:04 Найти цитируемый пост)
Ну так что, кто подскажет как покрасивше организовать код, отлавливающей проставку галок?))) 

Я бы привёл, но сейчас просто вгору некогда даже глянуть. Изучай MVVM и решение само собой придёт  smile 

Автор: ДобренькийПапаша 12.7.2011, 07:49
Цитата(Rohoss @  4.7.2011,  15:45 Найти цитируемый пост)
Наверное, если ты хочешь только декоративно, то так не получится. однако, такой кейс легко реализуется через MVVM.  

Спросил на MSDN. Оказывается это решается так:
Код

<ListView x:Name="lv" SelectionMode="Single">
      <ListView.View>
        <GridView>
          <GridView.Columns>
            <GridViewColumn>
              <GridViewColumn.CellTemplate>
                <DataTemplate>
                  <CheckBox IsChecked="{Binding IsSelected,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListViewItem}}}" />
                </DataTemplate>
              </GridViewColumn.CellTemplate>
            </GridViewColumn>
          </GridView.Columns>
        </GridView>
      </ListView.View>
    </ListView>

Вот только понять бы теперь механизм того как это работает smile То, что указана относительная привязка и указанием типа предка понятно. Но как так получается, что одна галка ставится, а прошлая снимается - непонятно. При этом всё работает даже если щёлкать тупо на строке в ListView, совершенно необязательно тыкать на checkbox. То есть, работает всё идеально. Но вот как оно работает? smile

Автор: Kefir 12.7.2011, 09:13
ДобренькийПапаша, в ListView есть такая штука, что при условии что SelectionMode="Single" только один элемент может быть выбран одновременно. Внутри ListView сидят элементы ListViewItem у которых есть св-во IsSelected. Когда ты клацаешь мышкой на один из ListViewItem его св-во IsSelected ставится в true (а поскольку только один элемент может быть выбран, то у всех других ListViewItem теперь IsSelected=false). А поскольку твой чекбокс привязан в этому самому свойству IsSelected, то чекбокс будет точно также менять свои значения в зависимости от того у какого ListViewItem IsSelected == true.

(надеюсь не очень запутанно объяснил smile)

Автор: ДобренькийПапаша 12.7.2011, 09:34
Ах, вот что за IsSelected. Ясно. Спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)