0

我正在尝试设置几个切换按钮的 DataContext,每个切换按钮都对应于列表的特定元素。这些切换按钮是静态的,不是动态生成的,因为我们想在布局中对它们进行分组,而不是将它们全部放在一个区域中。

ListOfRoles是对象的集合,每个对象都有一个IsSelected属性(类型bool?)和一个名称。转换器返回具有nameToObject转换器中给定名称的对象。

我的问题是 XAMLIsSelected在评估 DataContext 绑定之前尝试绑定,这会在我们的系统上引发异常。它尝试绑定到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 中属性的顺序,尝试使用指定绑定(嵌套标签)的长格式,但我只是没有想法。

提前致谢。

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>

备注:不要将一个布局控件用于另一个布局控件。(网格内的StackPanel

于 2012-05-10T05:18:40.437 回答