2013-06-13 34 views
2

我有一個ListView,其中View包含一個GridView和一些列定義。 如下:在一個樣式中GridViewColumn標題綁定失敗

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" > 
     <ListView.View> 
      <GridView AllowsColumnReorder="False"> 
       <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" /> 
       <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" /> 
       <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" /> 
       <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" /> 
       <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

(這完全適用)

我有一個要求,隱藏用戶偏好的第一列,所以我創建了一個樣式觸發器來實現這一目標。與風格觸發的代碼如下

<ListView Name="SampleListView" ItemsSource="{Binding SomeSource}" > 
     <ListView.Resources> 
      <Style x:Key="{x:Type ListView}" TargetType="ListView"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="False"> 
         <Setter Property="View"> 
          <Setter.Value> 
           <GridView x:Name="WithOutColumn1" AllowsColumnReorder="False"> 
             <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" /> 
            </GridView> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Source={x:Static p:User.Default},Path=ShowColumn1,Mode=OneWay}" Value="True"> 
         <Setter Property="View"> 
          <Setter.Value> 
           <GridView x:Name="WithColumn1" AllowsColumnReorder="False"> 
             <GridViewColumn Header="{Binding ColumnHeader1,Mode=OneWay}" CellTemplate="{StaticResource Column1Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader2,Mode=OneWay}" CellTemplate="{StaticResource Column2Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader3,Mode=OneWay}" CellTemplate="{StaticResource Column3Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader4,Mode=OneWay}" CellTemplate="{StaticResource Column4Template}" /> 
             <GridViewColumn Header="{Binding ColumnHeader5,Mode=OneWay}" CellTemplate="{StaticResource Column5Template}" /> 
           </GridView> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListView.Resources> 
    </ListView> 

當這種風格用於GridViewColumn頭屬性不起作用綁定。

但是CellTemplate的綁定確實並正確顯示。

在VS輸出窗口顯示該錯誤

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=ColumnHeader1; DataItem=null; target element is 'GridViewColumn' (HashCode=56585823); target property is 'Header' (type 'Object

任何人都可以闡明爲什麼這會發生,以及如何解決它的一些光?

事情嘗試:

  • 使用RelativePath結合,以確保在DataContext是有效的。 (懷疑這不工作,因爲我覺得GridViewColumn定義 視覺樹之外存在這個職位Here

  • 創建用於HeaderTemplate中一個DataTemplate:相同的結果。

  • 使用一個FrameworkElement的作爲代理按照這個帖子Here

回答

3

萬一別人是有這樣我已經找到了解決的問題。

必須在該項目的XAML標籤中設置和綁定GridViewColumn Header屬性,如下所示。

<Setter Property="View"> 
<Setter.Value> 
    <GridView x:Name="WithOutColumn1" AllowsColumnReorder="False"> 
     <GridViewColumn CellTemplate="{StaticResource Column2Template}"> 
      <GridViewColumnHeader Content="{Binding ColumnHeader2}" /> 
     </GridViewColumn> 
     <GridViewColumn CellTemplate="{StaticResource Column3Template}"> 
      <GridViewColumnHeader Content="{Binding ColumnHeader3}" /> 
     </GridViewColumn> 
     <GridViewColumn CellTemplate="{StaticResource Column4Template}"> 
      <GridViewColumnHeader Content="{Binding ColumnHeader3}" /> 
     </GridViewColumn> 
     <GridViewColumn CellTemplate="{StaticResource Column5Template}"> 
      <GridViewColumnHeader Content="{Binding ColumnHeader3}" /> 
     </GridViewColumn> 
    </GridView> 
</Setter.Value> 

希望完全,如果你遇到類似的問題,這將是有益的。

+0

感謝發佈。我有完全相同的問題,併爲我解決了這個問題。 –