2010-09-20 29 views
9

Tôi có một hộp kiểm, và một ItemsControl Populating nhiều lưới dữ liệu sủ theo cách sau:WPF Binding để ElementName bên ItemsControl

<Checkbox Content="Birthday Column Visible" x:Name="UI_BirthdayVisibleCB" /> 

<ItemsControl ItemsSource="{Binding Path=ParentsCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Children}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Birthday" Width="120" Visibility="{Binding IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" > 
... 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
</Rest of closing tags> 

Điều này tạo ra ràng buộc lỗi đầu ra như nó cố gắng tìm IsChecked trên DataGridTemplateColumn. Nếu tôi cố gắng tìm kiếm một tổ tiên tương đối tôi nhận được ngoại lệ:

Binding.RelativeSource cannot be set while using Binding.ElementName. 

Tôi có một ViewModel, và dính vào MVVM chủ yếu, nhưng trong trường hợp này, tôi thực sự muốn giữ cho chế độ hiển thị cột trên các Xem lớp . Lưu ý rằng BoolToVis chỉ chuyển đổi Boolean thành Visibility.

Sửa

Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm:

<DataGridTemplateColumn Header="Birthday" Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=IsChecked, ElementName=UI_BirthdayVisibleCB, Converter={StaticResource BoolToVis}}" /> 

Nó biên dịch nhưng không chạy tuy nhiên, nó ném ngoại lệ trên.

Trả lời

3

Nếu bạn muốn thử RelativeSource, bạn phải gỡ bỏ ElementName từ việc kê khai:

Tuy nhiên, chỉ có một trong ba tài sản, ElementName, Nguồn, và RelativeSource, nên được thiết lập cho mỗi ràng buộc, hoặc xung đột có thể xảy ra. Tài sản này ném một ngoại lệ nếu có xung đột nguồn ràng buộc.

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.elementname.aspx

sử dụng của bạn của ElementName dường như đúng, vì vậy tôi sẽ tiếp tục xem xét vấn đề nếu bạn thích rằng hơn RelativeSource.

+0

Vấn đề là tôi cần cả tên phần tử và RelativeSource, vì DataContext của tôi được đặt thành mục hiện tại của ItemsControl. – bufferz

+0

Hãy đăng mã sử dụng cả ElementName và RelativeSource. – McStretch

+0

Ok - Tôi đã chỉnh sửa câu hỏi của mình để hiển thị những gì tôi đang cố gắng thực hiện. – bufferz

11

Bạn đang sử dụng RelativeSource, không thể trộn lẫn với ElementName, nhưng khi bạn có RelativeSource chính xác, bạn có thể xem chi tiết đường dẫn sử dụng.

ví dụ:

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=UI_BirthdayVisibleCB.IsChecked, Converter={StaticResource BoolToVis}}" 

có lẽ bạn có một số XAML như thế này:

<UserControl class="MyView" ... >...<CheckBox Name="UI_BirthdayVisibileCB"/> ... 

Trên đây ràng buộc nên tìm UserControl này bằng cách loại dựa trên RelativeSource, sau đó nó sẽ cố gắng để tìm một tài sản mang tên UI_BirthdayVisibleCB, mà nó đã giành' t tìm thấy vì WPF XAML thực hiện phần tử được đặt tên này làm trường.

Công việc dễ dàng xung quanh là để đi vào codebehind của bạn và phơi bày một tài sản cho nó.

public object BirthdayVisibileCB_4_binding { 
    get { return UI_BirthdayVisibileDB; } 
} 

và liên kết với nó thay vì:

Visibility="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type local:MyView} }, 
Path=BirthdayVisibileCB_4_binding.IsChecked, Converter={StaticResource BoolToVis}}" 

Vâng, nó loại một nỗi đau để làm điều này, nhưng MVVM chỉ phù hợp với WPF cho đến nay ... nó không phải là một phù hợp tuyệt vời, duy nhất của nó là phù hợp nhất chúng ta có xung quanh.

+1

đây là giải pháp tốt nhất tôi tìm thấy cho vấn đề này. thêm một tiền thưởng là nó biên dịch thời gian an toàn –

+1

Cảm ơn bạn vì điều này! Tôi đã thực sự thất vọng khi cố gắng giải quyết một vấn đề tương tự. Tôi ngạc nhiên rằng WPF có một sự giám sát như vậy. Kể từ khi đăng bài này, bạn có gặp phải bất kỳ giải pháp nào khác không? –

+0

@ HenryMerriam nope, tôi đã không tìm thấy một cách tốt hơn. Tôi cũng không còn sử dụng WPF ngày này nữa :) Chúc may mắn. – jrwren

Các vấn đề liên quan