1

我要解决的一般问题是只有一个数据模板用于复选框,然后我可以将其用于列表视图中的许多不同列(使用网格视图)。在所有示例中,我都看到为每个绑定创建了一个单独的模板,这对我来说似乎有点矫枉过正。

我一直在尝试通过创建 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>

在这样的场景下,我希望在每个“可见行”文本上方看到“标题”

4

2 回答 2

3

我检查了 snoop,原因是它不起作用,因为 GridColumnHeader 不在 GridRows 所在的 VisualTree 中。我的解决方案是使用 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>
于 2012-08-05T21:57:14.793 回答
2

我尝试绑定到 GridViewColumn 的问题似乎有两个方面:

  • 首先,GridViewColumn 只能提供一个结果值(可能是 itemssource 中的第一项),而不是每行的值。

  • 其次, GridViewColumn 似乎不存在于可视化树中,因此不可用于绑定。

进一步的研究表明,要绑定到 GridViewColumn 的属性,可以使用以下语法:

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

MSDN 获得:将参数传递到 GridViewColumn 中指定的 CellTemplate

于 2012-08-05T21:50:47.870 回答