使い方を教えてくださいコンポーネントのラインナップバインディングとRelativeSource?
-
01-07-2019 - |
質問
使い方を教えてください RelativeSource
とコンポーネントのラインナップバインディングとは異なる使用のケースはどうでしょうか。
解決
い優先度をつけたい場合には別物件のオブジェクト:
{Binding Path=PathToProperty, RelativeSource={RelativeSource Self}}
取得したい場合、プロパティの祖先:
{Binding Path=PathToProperty,
RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
取得したい場合、プロパティの分子を鋳型とした親可能になっています2つの方のバインディングにControlTemplate)
{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}
または、短い(これだけの作品のための片道のバインディング):
{TemplateBinding Path=PathToProperty}
他のヒント
Binding RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemType}
}
...
デフォルトの属性 RelativeSource
は Mode
物件です。完全なセットの有効な値はこちららにMSDN):
PreviousData できる結合する前のデータアイテムから制御が含まれるデータ項目リストデータの項目が表示されます。
TemplatedParent の要素は、テンプレートのドラッグアンドドロップでき要素が存在する)が適用されます。これは、その設定TemplateBindingExtensionとする場合にだけ適用可能Binding内には、テンプレートを作成します。
自己 の要素に関する設定を結合で結合する一つの要素を別の物件で同じ要素になります。
FindAncestor とは、上位の親会社チェーンのドラッグアンドドロップでき要素です。利用することができる結合した先祖の特定の型またはそのサブクラス.このモードの使用を指定する場合には、AncestorTypeおよび/またはAncestorLevel.
こちらはより視覚的に説明ではのコンテキストでョ建築
想像しこの場合、矩形のことをしたいが、その高さは必ず同じになるので、その幅は、スクエアしましょう言うまでもない。ることができまを用い要素の名前
<Rectangle Fill="Red" Name="rectangle"
Height="100" Stroke="Black"
Canvas.Top="100" Canvas.Left="100"
Width="{Binding ElementName=rectangle,
Path=Height}"/>
このような場合には義務を伴う具体的に記入して下さ結合オブジェクト、すなわち、矩形を塗りつぶします。また、同じ目的別のRelativeSource
<Rectangle Fill="Red" Height="100"
Stroke="Black"
Width="{Binding RelativeSource={RelativeSource Self},
Path=Height}"/>
そして義務を負わないものの名称結合オブジェクトの幅にいつもと同じ高さまでの高さが変更されます。
したい場合はパラメータの幅の半分の高させることができる追加コンバーターへの結合のマークアップします。もう他の場合は現在:
<TextBlock Width="{Binding RelativeSource={RelativeSource Self},
Path=Parent.ActualWidth}"/>
上記の場合は提携与えられたプロパティで指定の要素への直接の親になっているものをこの要素を保有客様の電話番号をお知らせ下さいという。ここにあることを明らかに別の相対的なモードソースのFindAncestorます。
Bechir Bejaoui公開の場合のRelativeSourcesにコンポーネントのラインナップに 彼のこと:
のRelativeSourceはマークアップの拡張に使用される特定の 結合の場合においては、結合する物件のオブジェクト 別のオブジェクト自体においては、結合する件 のオブジェクトを別のものに対して両親が結合する 依存性プロパティ値をピーの場合はカスタム制御 開発し利用の場合はデフのシリーズ で示されるデータです。すべての状況と相対源 モードがある。まなすべての例です。
- モード:
想像しこの場合、矩形のことをしたいが、その高さは常に 等その幅は、スクエアしましょう言うまでもない。ることができま利用 要素名
<Rectangle Fill="Red" Name="rectangle" Height="100" Stroke="Black" Canvas.Top="100" Canvas.Left="100" Width="{Binding ElementName=rectangle, Path=Height}"/>
このような場合には義務を伴う具体的に記入して下さ 結合オブジェクト、すなわち、矩形を塗りつぶします。また、同じ目的 別のRelativeSource
<Rectangle Fill="Red" Height="100" Stroke="Black" Width="{Binding RelativeSource={RelativeSource Self}, Path=Height}"/>
そして義務を負わないものの名称結合 オブジェクトの幅にいつもと同じ高さつ 高さが変更されます。
したい場合はパラメータの幅の半分の高さ これまでに追加コンバーターへの結合のマークアップします。もう他の場合は現在:
<TextBlock Width="{Binding RelativeSource={RelativeSource Self}, Path=Parent.ActualWidth}"/>
上記の場合は提携与えられたプロパティで指定の要素 その直接の親になっているものをこの要素を保有客様の電話番号をお知らせ下さい といいます。ここにあることを明らかに別の相対的なモードソースである のFindAncestorます。
- モードFindAncestor
この場合、プロパティを指定の要素を結びつつあるの 親のCorse.主な違いは、上記の場合は ができるの祖先型、祖先 ランクの階層にタイの物件です。ようにしてレ この作品のポ
<Canvas Name="Parent0"> <Border Name="Parent1" Width="{Binding RelativeSource={RelativeSource Self}, Path=Parent.ActualWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Parent.ActualHeight}"> <Canvas Name="Parent2"> <Border Name="Parent3" Width="{Binding RelativeSource={RelativeSource Self}, Path=Parent.ActualWidth}" Height="{Binding RelativeSource={RelativeSource Self}, Path=Parent.ActualHeight}"> <Canvas Name="Parent4"> <TextBlock FontSize="16" Margin="5" Text="Display the name of the ancestor"/> <TextBlock FontSize="16" Margin="50" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Border}, AncestorLevel=2},Path=Name}" Width="200"/> </Canvas> </Border> </Canvas> </Border> </Canvas>
上記の状況につTextBlock要素も組み込み シリーズ内での国境、canvas要素その表 階層ます。第TextBlockの表示名 指定された親会社での相対的なソースです。
うに変更してみてくださいAncestorLevel=2AncestorLevel=1とう などが挙げられる。その後に変更してみて下さいタイプの祖先からの AncestorType=国境をAncestorType=に、キャンバスにされています。
表示されるテキストが変わってしまうの祖先型 ます。その後何が起こる場合、上位レベルは適しませんの 祖す。この問いをもたらすであろうと確信してまい お願いします。の応答がない例外がスローされ、絵まで に表示されTextBlockます。
- TemplatedParent
このモードで提携されControlTemplateィホテルグランドパレスのすぐ横 を制御することにControlTemplate適用します。るもの を理解する課題の例は以下
<Window.Resources> <ControlTemplate x:Key="template"> <Canvas> <Canvas.RenderTransform> <RotateTransform Angle="20"/> </Canvas.RenderTransform> <Ellipse Height="100" Width="150" Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}"> </Ellipse> <ContentPresenter Margin="35" Content="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Content}"/> </Canvas> </ControlTemplate> </Window.Resources> <Canvas Name="Parent0"> <Button Margin="50" Template="{StaticResource template}" Height="0" Canvas.Left="0" Canvas.Top="0" Width="0"> <TextBlock FontSize="22">Click me</TextBlock> </Button> </Canvas>
したい場合は、特性の制御、その制御 テンプレートを使用できますのTemplatedParentモードになります。もあり 同様にこのマークアップの拡張であるTemplateBinding このような観点からは、短い方の一つが、 TemplateBinding評価でコンパイル時間のコントラスト TemplatedParentを評価しその直後に実行す。として きの発言は、以下の図の背景と内容 適用ボタンのテンプレートを作成します。
にコンポーネントのラインナップ RelativeSource
結合本文三 properties
設定:
1.モード: この enum
きい値:
a.PreviousData(
value=0
): で付け前の値property
へ の一b.TemplatedParent(
value=1
): る場合に使用しますを定義するtemplates
の 任意の制御たいと結合する値に設定をcontrol
.例えば、 定義
ControlTemplate
:
<ControlTemplate>
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</ControlTemplate>
c.自己(
value=2
): いたい場合はbindからself
またはproperty
用しています。例えば: 送信確認状況
checkbox
としてCommandParameter
中の設定Command
月CheckBox
<CheckBox ...... CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=IsChecked}" />
d.FindAncestor(
value=3
): 思ったときに結合親control
にVisual Tree
.例えば: 結合する
checkbox
にrecords
の場合grid
場合、header
checkbox
確認
<CheckBox IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}, Path=DataContext.IsHeaderChecked, Mode=TwoWay}" />
2.AncestorType: 合モード FindAncestor
その定義をどのような祖先
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid}}
3.AncestorLevel: 合モード FindAncestor
そしてどの程度の祖先が成立しない場合はそのスイッチを同一のハードウェアの親会社で visual tree
)
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type iDP:XamDataGrid, AncestorLevel=1}}
上記すべての活用例
RelativeSource binding
.
お忘れなくTemplatedParent:
<Binding RelativeSource="{RelativeSource TemplatedParent}"/>
または
{Binding RelativeSource={RelativeSource TemplatedParent}}
で注目しておきたいということは、寄この考え方のSilverlight:
Silverlightの場合には、減サブセットだけに、これらのコマンド
作成した図書館の簡素化に結合構文のコンポーネントのラインナップなどで使いやすRelativeSource.こちらによって異なる場合があります。前:
{Binding Path=PathToProperty, RelativeSource={RelativeSource Self}}
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
{Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}
{Binding Path=Text, ElementName=MyTextBox}
変更後:
{BindTo PathToProperty}
{BindTo Ancestor.typeOfAncestor.PathToProperty}
{BindTo Template.PathToProperty}
{BindTo #MyTextBox.Text}
ここで、制御することが可能である。法の結合が容易です。前:
// C# code
private ICommand _saveCommand;
public ICommand SaveCommand {
get {
if (_saveCommand == null) {
_saveCommand = new RelayCommand(x => this.SaveObject());
}
return _saveCommand;
}
}
private void SaveObject() {
// do something
}
// XAML
{Binding Path=SaveCommand}
変更後:
// C# code
private void SaveObject() {
// do something
}
// XAML
{BindTo SaveObject()}
き図書館はこちら http://www.simplygoodcode.com/2012/08/simpler-wpf-binding.html
注の前の例ではその使用方法を結合するコードで最適化 RelayCommand
るいはネイティブのコンポーネントのラインナップ.なる前の例ではもっと長くなります。
つかの有用なピ:
この方法で主にコード:
Binding b = new Binding();
b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, this.GetType(), 1);
b.Path = new PropertyPath("MyElementThatNeedsBinding");
MyLabel.SetBinding(ContentProperty, b);
私の主たコピーこれから 結合相対的なソースコードの背後に.
また、MSDNのページをリアを表示一部のエリアこの例: RelativeSourceクラス
まだ投稿 別の解決 アクセスするためのDataContextの親要素にはSilverlightすることができます。使用す Binding ElementName
.
私は読めない毎回答いきたいと思いこの機能を追加した場合、その相対的なソースのコマンドの結合のボタンを押します。
ご利用の際は相対源 Mode=FindAncestor
, の結合が必要のように:
Command="{Binding Path=DataContext.CommandProperty, RelativeSource={...}}"
ない場合の追加DataContextパスの中に、実行時間をかを取得する物件です。
この例では、このパターンとして勝ちたい空の印刷.
<Style.Triggers>
<DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
<Setter Property="Background">
<Setter.Value>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Text="We did't find any matching records for your search..." FontSize="16" FontWeight="SemiBold" Foreground="LightCoral"/>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
場合には要素の一部ではない視覚のツリー、RelativeSourceいます。
この場合、必要なものに異なる技術の先駆けて開発したトーマス-Levesque.
これからも世の中を元気にし、解決策を自分のブログの下で [コンポーネントのラインナップ]どのように結合するデータがDataContextは継承されません.でも絶対に見事に!
しかしながら、同氏のブログは、付録Aが含まれて鏡面のコピー 彼の記事.
ないでくださいコメントください コーディングポスト.
付録A:ミラーのブログ
のDataContext財産のコンポーネントのラインナップは非常に便利で自動的に継承すべての子どものいる要素を指定するそのため必要な設定では各要素にしたい連結します。しかし、場合には、DataContextにアクセスすることはできません:うための要素を見つける事ができますの視覚的または論理です。でくのは非常に困難であるとして結合する物件のような要素を...
みを説明する簡単な例:して表示したいリストの製品開発を維持-管理。のグリッドまで案内したいと考えている表示/非表示の価格のカラムの値のShowPrice物件によって明らかにされた一連のViewModel.当然のアプローチを結びつける視認性のカラムのShowPrice物件:
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
Visibility="{Binding ShowPrice,
Converter={StaticResource visibilityConverter}}"/>
残念ながらの値を変更ShowPriceは、カラムは常に見えて---なぜですか?した場合の出力ウィンドウにVisual Studioに、今まで知らのインストール:
システム。Windowsの場合です。データエラー:2:見つからな治FrameworkElementはFrameworkContentElement対象要素となります。BindingExpression:Path=ShowPrice;DataItem=null;対象の要素は"DataGridTextColumn'(HashCode=32685253);対象不動産は視認性'(タイプ'視認性の')
メッセージで隠すが、意味はとてもシンプルです:コンポーネントのラインナップとなるFrameworkElement利用のDataContextので、カラムとして捉えられるべきだと思いを視覚的または論理的なツリーの開発を維持-管理。
まく調節のための結合の結果、インスタンスに設定してRelativeSourceの開発を維持-管理そのもの:
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
Visibility="{Binding DataContext.ShowPrice,
Converter={StaticResource visibilityConverter},
RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/>
または当社ブログにアクセスいただき、チェックボックスバShowPrice、bindのカラムの可視性をIsChecked物件を指定する要素の名前:
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
Visibility="{Binding IsChecked,
Converter={StaticResource visibilityConverter},
ElementName=chkShowPrice}"/>
なのこれらの回避策のように、しずつ開催数を増やしていきたい同じ結果に...
この点でのみ実行可能なアプローチが変更されるカラムの視認性コード-遅いことが分かってい好な利用の場合はョパターンの---ってるつもりはありませんうち、少なくともそのようなことはしないその他のオプションを考える😉
の問題はとても簡単に、かFreezableクラスです。第一の目的は、このクラスが定義オブジェクトにて変更可能と読み取り専用の状態が、興味深い特徴はこの例の場合はFreezableオブジェクトを受け継ぐDataContextユーザーが外出中であってもないの視覚的または論理です。わからない、正確な仕組みこの動作が、今においては総じてitの有効活用に結合を作---
その考え方としては、クラスを作成するかBindingProxyを理由にすべきでなくてもすぐに)受け継ぐFreezableとを宣言するとデータ依存性:
public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
またそれを宣言するこのクラスのインスタンスを、資源の開発を維持-管理、結合するデータのプロパティに現在のDataContext:
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
最後のステップを指定するこBindingProxyオブジェクト(社StaticResourceとしてのソースを結合:
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False"
Visibility="{Binding Data.ShowPrice,
Converter={StaticResource visibilityConverter},
Source={StaticResource proxy}}"/>
この結合パスにて頭"データ"からのパスは相対的にBindingProxyオブジェクトです。
の結合が正しく動作し、カラムは正しく表示で表示させたのShowPrice物件です。