Как привязать свойство к столбцу gridview по его шаблону

Основная проблема, которую я хочу решить, - иметь только одну таблицу данных для флажка, которую я затем могу использовать для множества различных столбцов в виде списка (используя вид сетки). Во всех примерах я видел отдельный шаблон для каждой привязки, который кажется мне излишним.

Я пытался сделать это путем создания прикрепленного свойства, которое будет устанавливать gridviewcolumn. Тогда я могу просто иметь одну таблицу данных для флажка, который привязывается к этому прикрепленному свойству.

Проблема, с которой я столкнулся, заключается в том, чтобы на самом деле установить источник флажка в gridviewcolumn.

Вот XAML:

<DataTemplate x:Key="CheckBoxTemplate">
    <CheckBox IsChecked="{Binding Path=(ap:AttachedProperties.IsChecked),
        RelativeSource={RelativeSource AncestorType={x:Type GridViewColumn}}}" />
</DataTemplate>

<GridView x:Key="MyGridView">
    <GridViewColumn Header="CheckBox" CellTemplate="{StaticResource CheckBoxTemplate}" ap:AttachedProperties.IsChecked="{Binding Path=SomeValue}" />
</GridView>

PS Свойство Attached работает нормально, я прикрепил его непосредственно к флажку, использовал самообязание родственника и получил значения, полученные через него, но когда я пытаюсь связать его с GridViewColumn, я не чувствую счастья, на самом деле у меня нет ' не удалось привязать к заголовку на GridViewColumn либо...

PPS Я пробовал и другие обязательные исходные выражения (кажется, не совсем правильное)...

Редактировать: Сразу после публикации это меня осенило, что GridViewColumn существует для всех строк, и поэтому, вероятно, это не работает?!

Я спал об этом сейчас и понимаю, что выполнение таких действий не будет работать (потому что GridViewColumn может содержать значение только для первой строки, а не для каждой строки, как мне бы это понадобилось) - однако я все еще думал бы, что это возможно привязать к GridViewColumn?

Вот только пример xaml, чтобы показать поведение:

<Window x:Class="WpfApplication3.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow"
       Width="525"
       Height="350">
   <Grid>
       <ListView Name="listView1"
                 Width="479"
                 Height="287"
                 Margin="12,12,0,0"
                 HorizontalAlignment="Left"
                 VerticalAlignment="Top">
           <ListView.View>
               <GridView>
                   <GridViewColumn Header="A Header">
                       <GridViewColumn.CellTemplate>
                           <DataTemplate>
                               <StackPanel>
                                   <TextBlock Text="{Binding Path=Header, RelativeSource={RelativeSource AncestorType={x:Type GridViewColumn}}}" />
                                   <TextBlock Text="Visible row" />
                               </StackPanel>
                           </DataTemplate>
                       </GridViewColumn.CellTemplate>
                   </GridViewColumn>
               </GridView>
           </ListView.View>
           <ListViewItem />
           <ListViewItem />
       </ListView>
   </Grid>
</Window>

Под таким сценарием я бы ожидал увидеть "Заголовок" чуть выше каждого текста "Видимая строка"

2 ответа

Решение

Я проверил snoop, причину, по которой это не работает, потому что GridColumnHeader не находится в VisualTree, где находятся GridRows. Мое решение состоит в том, чтобы использовать ElementName и связать его со свойством Header. Довольно просто, намного чище и читабельнее.

    <ListView Name="listView1"
             Width="479"
             Height="287"
             Margin="12,12,0,0"
             HorizontalAlignment="Left"
             VerticalAlignment="Top">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="A Header" x:Name="HeaderOne">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding ElementName=HeaderOne,Path=Header}" />
                                <TextBlock Text="Visible row" />
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
        <ListViewItem />
        <ListViewItem />
    </ListView>

Моя проблема с попыткой привязки к GridViewColumn выглядит двоякой:

  • Во-первых, GridViewColumn может предоставить только одно результирующее значение (возможно, первый элемент в источнике элементов), а не значение для каждой строки.

  • Во-вторых, GridViewColumn не существует в визуальном дереве и поэтому не доступен для привязки.

Дальнейшие исследования показывают, что для привязки к свойствам GridViewColumn можно использовать следующий синтаксис:

<TextBlock Text="{Binding Path=View.Columns[0].Header, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" />

Получено из MSDN: передача параметра в шаблон CellTemplate, указанный в GridViewColumn

Другие вопросы по тегам