[解決済み] DataTemplateから親DataContextにアクセスする
質問
私は
ListBox
があり、ViewModel 上の子コレクションにバインドされています。リストボックスの項目は、親 ViewModel のプロパティに基づいて datatemplate でスタイルが設定されます。
<Style x:Key="curveSpeedNonConstantParameterCell">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified,
ElementName=someParentElementWithReferenceToRootDataContext}"
Value="True">
<Setter Property="Control.Visibility" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
以下のような出力エラーが出ます。
System.Windows.Data Error: 39 : BindingExpression path error:
'CurveSpeedMustBeSpecified' property not found on
'object' ''BindingListCollectionView' (HashCode=20467555)'.
BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified;
DataItem='Grid' (Name='nonConstantCurveParametersGrid');
target element is 'TextBox' (Name='');
target property is 'NoTarget' (type 'Object')
ということで、バインド式を
"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
に変更すると動作しますが、これは親ユーザーコントロールのデータコンテキストが
BindingListCollectionView
. のプロパティにバインドされるため、これは受け入れられません。
CurrentItem
のプロパティにバインドされるからである。
BindingList
を自動生成します。
親データ コンテキストがコレクション ビューであるか単一項目であるかに関係なく動作するように、スタイル内でバインド式を指定するにはどうすればよいですか。
どのように解決するのですか?
私はSilverlightの相対的なソースで問題がありました。検索して読んだ後、私はいくつかの追加のバインディング ライブラリを使用せずに適切な解決策を見つけることができませんでした。しかし、ここにあります。
親DataContextにアクセスするための別の方法です。
のように、データコンテキストを知っている要素を直接参照することで、親データコンテキストにアクセスすることができます。これは
Binding ElementName
を使用し、独自の命名法を尊重し
templates
/
styles
コンポーネントをまたいで
<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content={Binding MyLevel2Property}
Command={Binding ElementName=level1Lister,
Path=DataContext.MyLevel1Command}
CommandParameter={Binding MyLevel2Property}>
</Button>
<DataTemplate>
<ItemsControl.ItemTemplate>
</ItemsControl>
これは、ボタンを
Style
/
Template
:
<Border.Resources>
<Style x:Key="buttonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Button Command={Binding ElementName=level1Lister,
Path=DataContext.MyLevel1Command}
CommandParameter={Binding MyLevel2Property}>
<ContentPresenter/>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Border.Resources>
<ItemsControl x:Name="level1Lister" ItemsSource={Binding MyLevel1List}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding MyLevel2Property}"
Style="{StaticResource buttonStyle}"/>
<DataTemplate>
<ItemsControl.ItemTemplate>
</ItemsControl>
最初、私は
x:Names
はテンプレート化されたアイテム内からはアクセスできないのではと思いましたが、他に良い解決策がなかったので試してみたところ、問題なく動作しました。
関連
-
[解決済み】無料のWPFテーマがあれば教えてください。[クローズド]
-
[解決済み] WPFのテキストラップとWrapWithOverflowの比較
-
[解決済み] DataTrigger where value is NOT null?
-
[解決済み] WPFバインディングを使用して2つのコマンドパラメータを渡す
-
[解決済み] WPF Numeric UpDownコントロールはどこにありますか?
-
[解決済み] 16進数の色値からSolidColorBrushを作成する
-
[解決済み] WPFのキーボードショートカット
-
[解決済み] WPFでトグルボタンのグループをラジオボタンのように動作させるには?
-
[解決済み] WPFのスライダーを整数の位置にのみスナップさせる方法とは?
-
[解決済み] WPFウィンドウのハンドルを検索する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み】Visual Studio 2015の追加デバッグオプションの無効化
-
[解決済み】無料のWPFテーマがあれば教えてください。[クローズド]
-
[解決済み] ユーザーコントロールライブラリーとカスタムコントロールライブラリーの違いは何ですか?
-
[解決済み] wpf: ボタンがコマンドによって無効にされたとき、ツールチップを表示する方法は?
-
[解決済み] WPFでイベント処理のためにリソース辞書の後ろにコードを設定することは可能ですか?
-
[解決済み] WPF: スクロールバー付きItemsControl (ScrollViewer)
-
[解決済み] グリッドカラムの幅・高さを設定する際の「Auto」と「*」の違いは何ですか?
-
[解決済み] WPFバインディングで値をnullに設定する