0

それぞれがリストの特定の要素に対応するいくつかのトグルボタンのDataContextを設定しようとしています。これらのトグルボタンは静的であり、動的に生成されません。これは、これらをレイアウトにグループ化し、すべてを1つの領域に配置したくないためです。

ListOfRolesはオブジェクトのコレクションであり、各オブジェクトにはIsSelectedプロパティ(タイプbool?)と名前があります。コンバーターは、nameToObjectコンバーターで指定された名前のオブジェクトを返します。

私の問題は、XAMLがIsSelectedDataContextバインディングを評価する前にバインドしようとしていることです。これにより、システムで例外がスローされます。適用されているオブジェクトにバインドしようとしRoleContainerStyle、クラッシュします。XAMLは次のとおりです。

<Style x:Key="RoleContainerStyle" TargetType="{x:Type MyControls:MyListBoxItem}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type MyControls:MyListBoxItem}">
        <Grid>
          <StackPanel Orientation="Horizontal" >
            <ToggleButton Content="Driver To Scene"   IsChecked="{Binding IsSelected}" DataContext="{Binding ListOfRoles, Converter={StaticResource nameToObject}, ConverterParameter='Driver To'}"    HorizontalAlignment="Stretch" Margin="0"       Width="80" Height="40" FontSize="14.667" />
            <ToggleButton Content="Driver From Scene" IsChecked="{Binding IsSelected}" DataContext="{Binding ListOfRoles, Converter={StaticResource nameToObject}, ConverterParameter='Driver From'}"  HorizontalAlignment="Stretch" Margin="8,0,0,0" Width="80" Height="40" FontSize="14.667" />
          </StackPanel>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

コンバーターにブレークポイントを設定し、バインディングを評価する前に、コンバーターに入らないことを確認しました。IsSelected

IsSelectedバインディングを削除すると、コンバーター内で実行をトラップできるため、XAMLについて何かが欠けている場合を除いて、評価の順序に問題があるように見えます。

XAMLでプロパティの順序を変更し、Bindings(ネストされたタグ)を指定する長い形式を使用してみましたが、アイデアがありません。

前もって感謝します。

4

1 に答える 1

0

IsSelectedプロパティに対してのみToggleButtonに DataContext を指定する必要があり、リストに常に 2 つの項目が含まれている場合は、これを使用できます (テストはしていませんが、理解していただければ幸いです)。

<Style x:Key="RoleContainerStyle" TargetType="{x:Type MyControls:MyListBoxItem}">
<Setter Property="Template">
<Setter.Value>
  <ControlTemplate TargetType="{x:Type MyControls:MyListBoxItem}">
      <StackPanel Orientation="Horizontal" >
        <ToggleButton Content="Driver To Scene"   IsChecked="{Binding ListOfRoles[0].IsSelected}" HorizontalAlignment="Stretch" Margin="0"       Width="80" Height="40" FontSize="14.667" />
        <ToggleButton Content="Driver From Scene" IsChecked="{Binding ListOfRoles[1].IsSelected}" HorizontalAlignment="Stretch" Margin="8,0,0,0" Width="80" Height="40" FontSize="14.667" />
      </StackPanel>
  </ControlTemplate>
</Setter.Value>

注意: あるレイアウト コントロールを別のレイアウト コントロールに使用しないでください。( Grid内のStackPanel )

于 2012-05-10T05:18:40.437 に答える