ViewModel の子コレクションにバインドする がありますListBox
。リストボックス項目は、親 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"
、親ユーザー コントロールの DataContext が である限り機能しますBindingListCollectionView
。ユーザー コントロールの残りの部分は の のプロパティに自動的にバインドされるため、これは受け入れられませCurrentItem
んBindingList
。
親データ コンテキストがコレクション ビューであるか単一の項目であるかに関係なく機能するように、スタイル内でバインディング式を指定するにはどうすればよいですか?
ベストアンサー1
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
テンプレート化されたアイテム内から親要素にアクセスできないと思っていましたが、より良い解決策が見つからなかったため、試してみたところ、問題なく動作しました。