2010-09-20 11 views
9

mam wyboru i ItemsControl wypełniania kilku datagrids następujący sposób:WPF Binding do ElementName wewnątrz 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> 

To tworzy wiązanie błędów wyjściowych, jak próbuje znaleźć IsChecked na DataGridTemplateColumn. Gdy próbuję szukać względnej Przodek Otrzymuję wyjątek:

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

Mam ViewModel, i trzymać się MVVM głównie, ale w tym przypadku naprawdę chciałbym, aby zachować ustawienia widoczności kolumn na warstwie View . Zauważ, że BoolToVis konwertuje tylko wartość Boolean na widoczność.

Edit

Oto przykład tego, co próbuję zrobić:

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

To kompiluje ale nie działa jednak zgłasza wyjątek powyżej.

Odpowiedz

3

Jeśli chcesz spróbować RelativeSource, trzeba usunąć ElementName od deklaracji:

Jednak tylko jeden z trzech właściwości ElementName, Source, a RelativeSource, należy ustawić dla każdego powiązanie lub może wystąpić konflikt. Ta właściwość zgłasza wyjątek, jeśli wystąpił konflikt źródła wiązania.

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

Twój wykorzystanie ElementName wydaje się prawidłowe, więc będę nadal spojrzeć na problem, jeśli wolisz, że ponad RelativeSource.

+0

Problem polega na tym, że potrzebuję zarówno nazwy elementu, jak i źródła relatywnego, ponieważ mój DataContext jest ustawiony na bieżący element ItemsControl. – bufferz

+0

Wyślij kod, który używa zarówno elementu ElementName, jak i RelativeSource. – McStretch

+0

OK - zredagowałem moje pytanie, aby pokazać, co próbuję zrobić. – bufferz

11

Używasz RelativeSource, którego nie można mieszać z ElementName, ale gdy masz już właściwy RelativeSource, możesz głębiej zagłębić się w ścieżkę.

np.

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

prawdopodobnie masz jakieś XAML tak:

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

Powyższy wiążące powinny znaleźć ten UserControl według rodzaju w oparciu o RelativeSource, to będzie starał się znaleźć właściwość o nazwie UI_BirthdayVisibleCB, który wygrał” t find, ponieważ WPF XAML implementuje ten nazwany element jako pole.

Łatwa praca polega na przejściu do kodu źródłowego i wyeksponowaniu jego właściwości.

public object BirthdayVisibileCB_4_binding { 
    get { return UI_BirthdayVisibileDB; } 
} 

i wiążą się z nią zamiast:

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

Tak, to niby ból to zrobić, ale pasuje tylko MVVM WPF tej pory ... jej nie idealnie pasuje, tylko jego najlepiej pasuje do nas.

+1

jest to najlepsze rozwiązanie, jakie znalazłem w tym problemie. jedną dodatkową premią jest to, że kompiluje się bezpiecznie –

+1

Dziękuję za to! Byłem bardzo sfrustrowany próbując rozwiązać podobny problem. Jestem zaskoczony, że WPF ma takie przeoczenie. Od kiedy to opublikowałeś, czy spotkałeś się z jakimś innym rozwiązaniem? –

+0

@HenryMerriam nie, nie znalazłem lepszego sposobu. Również nie używam już WPF z dnia na dzień :) Powodzenia. – jrwren

Powiązane problemy