Привязка WPF к ElementName внутри ItemsControl - PullRequest
9 голосов
/ 20 сентября 2010

У меня есть флажок и ItemsControl, заполняющий несколько DataGrids следующим образом:

<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>

Это создает ошибки вывода привязки при попытке найти IsChecked в DataGridTemplateColumn. Если я пытаюсь найти Относительного Предка, я получаю исключение:

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

У меня есть ViewModel, и я в основном придерживаюсь MVVM, но в этом случае мне бы очень хотелось сохранить видимость столбцов на слое View. Обратите внимание, что BoolToVis просто преобразует логическое значение в видимость.

Редактировать

Вот пример того, что я пытаюсь сделать:

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

Он компилируется, но не запускается, но выдает исключение выше.

Ответы [ 2 ]

11 голосов
/ 21 октября 2010

Вы используете RelativeSource, который нельзя смешивать с ElementName, но если у вас есть правильный RelativeSource, вы можете углубиться, используя путь.

например,

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

предположительно у вас есть некоторый xaml, подобный следующему:

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

Приведенная выше привязка должна найти этот UserControl по типу на основе RelativeSource, затем она попытается найти свойство с именем UI_BirthdayVisibleCB, которое не будет найдено, потому что WPF XAMLреализует этот именованный элемент как поле.

Простой способ обойти это - зайти в свой код и открыть для него свойство.

public object BirthdayVisibileCB_4_binding {
    get { return UI_BirthdayVisibileDB; }
}

и привязать к нему вместо этого:

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

Да, этоЭто было бы болезненно, но MVVM пока подходит только для WPF ... он не очень подходит, он только лучший, который у нас есть.

3 голосов
/ 20 сентября 2010

Если вы хотите попробовать RelativeSource, вы должны удалить ElementName из объявления:

Однако, только одно из трех свойств, ElementName, Source и RelativeSource, должно бытьустановить для каждой привязки, иначе может возникнуть конфликт.Это свойство выдает исключение, если существует конфликт источника привязки.

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

Ваше использование ElementName кажется правильным, поэтому я продолжу смотреть на проблему, если вы предпочитаете это RelativeSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...