2011-11-01 9 views
7

Đây là XAML:Ràng buộc với ElementName không hoạt động

<DataGrid Grid.Column="0" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}" 
       x:Name="ColumnsGrid" RowHeaderWidth="0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
           Header="{Binding ElementName=ColumnsGrid, Path=DataContext.Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

Binding lợi nhuận lỗi: System.Windows.Data Lỗi: 2: Không thể tìm thấy chi phối FrameworkElement hoặc FrameworkContentElement cho các phần tử mục tiêu.

Tôi bỏ lỡ điều gì?

Cập nhật:

Dưới đây là câu trả lời: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

What is happening here? The Columns collection is just a property in the Datagrid; this collection is not in the logical (or visual) tree, therefore the DataContext is not being inherited, which leads to there being nothing to bind to.

Cập nhật 2: Tốt bài viết về hãy cẩn thận DataGrid của: http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx

+1

Tôi không nghĩ rằng 'ElementName' làm việc * trong * cùng một nguyên tố . – ChrisF

+0

Đây là câu trả lời: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx > Điều gì đang xảy ra ở đây? Bộ sưu tập Cột chỉ là một thuộc tính > trong Datagrid; bộ sưu tập này không phải là hợp lý (hoặc trực quan) > cây, do đó DataContext không được kế thừa, dẫn đến > không có gì để liên kết. –

Trả lời

1

Ràng buộc trên DataGridColumn cho Header abd Visibility tính cần điều trị đặc biệt ...

Xem này ...

Bind datagrid column visibility MVVM

+0

Yep cũng có tác dụng đối với tôi. Cách tiếp cận 'ProxyElement' là một hack rất tốt. :-) –

0

Nếu bạn quan tâm đến Count thuộc tính của đối tượng được gọi trong DataContext bạn cố gắng và sử dụng liên kết dữ liệu thường xuyên:

<DataGrid Grid.Column="0" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}" 
      x:Name="ColumnsGrid" RowHeaderWidth="0"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
          Header="{Binding Path=Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/> 
    </DataGrid.Columns> 
</DataGrid> 

EDIT

Rõ ràng the columns of a datagrid are not part of the Visual Tree Vì vậy, sử dụng ElementName và RelativeSource sẽ không hoạt động. Có lẽ bạn nên thêm thuộc tính vào đối tượng mà cột bị ràng buộc.

+0

Tôi cần DataContext của DataGrid. –

+0

@voroninp - Bạn đã thử tổ tiên RelativeSource chưa? –

+0

Có, không giúp được –