Как привязать к последнему родителю - PullRequest
0 голосов
/ 18 июня 2011

In {RelativeSource FindAncestor, AncestorType={x:Type TypeName}, AncestorLevel=???} Какое значение я должен установить на AncestorLevel, чтобы достичь последнего родителя?

например, я хочу, чтобы последний родитель типа StackPanel.

Редактировать: Итак, если это невозможно, что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Насколько я знаю, это невозможно указать.

1 голос
/ 18 июня 2011

Нет, невозможно использовать FindAncestor для привязки к последнему предку, однако возможно написать MarkupExtension, которое выполняет это.

Вот простой пример, который вы можете расширить по мере необходимости

  class BindLastAncestor : MarkupExtension
  {
    public BindLastAncestor()
    {
    }

    public BindLastAncestor( Type ancestorType )
    {
    }

    public Type AncestorType
    {
      get;
      set;
    }

    public PropertyPath Path
    {
      get;
      set;
    }

    public override object ProvideValue( IServiceProvider serviceProvider )
    {
      var targetProvider = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));

      var target = targetProvider.TargetObject as DependencyObject;
      var targetProperty = targetProvider.TargetProperty as DependencyProperty;
      if (target == null || targetProvider == null)
        throw new NotSupportedException();

      var ancestor = target;
      DependencyObject lastAncestor = null;

      while (ancestor != null)
      {
        if (ancestor.GetType() == this.AncestorType)
          lastAncestor = ancestor;

        ancestor = VisualTreeHelper.GetParent(ancestor);
      }

      BindingOperations.SetBinding(target, targetProperty, new Binding { Path = this.Path, Source = lastAncestor });

      return target.GetValue(targetProperty);
    }
  }

Который теперь можно использовать так, например:

  <Grid x:Name="Grid1">
    <Grid x:Name="Grid2">
      <Grid x:Name="Grid3">
        <Grid x:Name="Grid4">
          <Grid x:Name="Grid5">
            <TextBox Text="{my:BindLastAncestor Path=Name, AncestorType=Grid}" />
          </Grid>
        </Grid>
      </Grid>
    </Grid>
  </Grid>

Результаты в TextBox, получая 'Grid1'

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