在属性绑定后评估DataContext绑定 - 导致崩溃

时间:2012-05-09 23:37:42

标签: wpf data-binding datacontext

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

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

我的问题是XAML在评估DataContext绑定之前尝试绑定IsSelected,这会在我们的系统上引发异常。它尝试绑定到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绑定,我 AM 能够在转换器中捕获执行,所以它似乎是评估顺序的问题,除非我遗漏了一些关于XAML的内容。

我尝试更改XAML中属性的顺序,尝试使用指定Bindings(嵌套标记)的长形式,我只是出于想法。

提前致谢。

1 个答案:

答案 0 :(得分: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