我想要解决的一般问题是只有一个复选框的数据窗口,然后我可以用于列表视图中的许多不同列(使用gridview)。在所有的例子中,我看到为每个绑定创建了一个单独的模板,这对我来说似乎有点过分了。
我一直在尝试通过创建gridviewcolumn将设置的附加属性来完成此操作。然后我可以简单地为一个绑定到该附加属性的复选框设置一个datatemplate。
我遇到的问题实际上是将复选框来源设置为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>
P.S。 Attached属性工作正常,我已经将它直接附加到复选框并使用了relativesource自我绑定并获得了值,但是当我尝试将它绑定在GridViewColumn上时我没有幸福,事实上我没有能够绑定到GridViewColumn上的Header ......
P.P.S我也尝试过其他绑定源表达式(看起来不是正确的)...
编辑: 在发布之后,我立刻意识到所有行都存在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>
在这样的场景下,我希望在每个“可见行”文本上方看到“A Header”
答案 0 :(得分:2)
我检查了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>
答案 1 :(得分:1)
我尝试绑定到GridViewColumn的问题似乎有两方面:
首先,GridViewColumn只能提供一个结果值(可能是itemssource中的第一项),而不是每行的值。
其次,GridViewColumn似乎不存在于visualtree中,因此无法绑定到。
进一步的研究表明,要绑定到GridViewColumn的属性,可以使用以下语法:
<TextBlock Text="{Binding Path=View.Columns[0].Header, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" />
从MSDN: Passing a parameter into a CellTemplate specified in a GridViewColumn获得