{RelativeSource FindAncestor, AncestorType={x:Type TypeName}, AncestorLevel=???}
AncestorLevel
に最後の親に到達するためにどのような値を設定する必要がありますか?最後の親にバインドする方法
私はタイプの最後の親が欲しいです。
編集:どうすればいいですか?
{RelativeSource FindAncestor, AncestorType={x:Type TypeName}, AncestorLevel=???}
AncestorLevel
に最後の親に到達するためにどのような値を設定する必要がありますか?最後の親にバインドする方法
私はタイプの最後の親が欲しいです。
編集:どうすればいいですか?
いいえ、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);
}
}
:「GRID1」
取得のTextBoxで<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>
結果
実行時に構造が変更された場合は、このアップデートを適用しますか? (そうでない場合は問題になります) –
@ H.B。ビジュアルツリーの変更をリッスンするためのコードが追加され、ProvideValue関数を再び実行しますが、これは単純な実装ではありません。 – MerickOWA
私が知る限り、それを指定することはできません。
いいえタイプの最後の親を欲しいですリストを親としたいStackPanelタイプ –
は祖先レベルを大きな数字に設定します(例: "999")? –
@ Zahid Sattar:いいえ、そうではありません。 –
あなたの構造は変わっていますか、それとも一度その要素を見つけるのに十分でしょうか? –
はいこれは動的なアプリケーションです –