DataTemplate から親 DataContext にアクセスする 質問する

DataTemplate から親 DataContext にアクセスする 質問する

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。ユーザー コントロールの残りの部分は の のプロパティに自動的にバインドされるため、これは受け入れられませCurrentItemBindingList

親データ コンテキストがコレクション ビューであるか単一の項目であるかに関係なく機能するように、スタイル内でバインディング式を指定するにはどうすればよいですか?

ベストアンサー1

Silverlightの相対ソースに問題がありました。検索して読んでも、追加のバインディングライブラリを使用しない適切な解決策は見つかりませんでした。しかし、ここにあります親DataContextにアクセスするための別のアプローチデータ コンテキストがわかっている要素を直接参照します。独自の命名を尊重し、コンポーネント間で/Binding ElementNameを頻繁に再利用しない限り、これは非常にうまく機能し、使用されます。templatesstyles

<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テンプレート化されたアイテム内から親要素にアクセスできないと思っていましたが、より良い解決策が見つからなかったため、試してみたところ、問題なく動作しました。

おすすめ記事