2012-05-09 54 views
0

我想设置几个切换按钮的DataContext,每个切换按钮将对应于列表的特定元素。这些切换按钮是静态的,不是动态生成的,因为我们想将它们分组在布局中,而不是将它们全部放在一个区域中。属性绑定后评估的DataContext绑定 - 导致崩溃

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

我的问题是XAML试图绑定IsSelected之前,它已经评估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> 

我把断点的转换器和验证,它DOES NOT试图评估IsSelected结合之前输入的转换器。

如果我删除IsSelected绑定,我AM能够在转换器内执行的陷阱,因此它似乎与评估的订单出现问题,除非我失去了一些东西约XAML。

我试着改变XAML中属性的顺序,尝试使用指定绑定(嵌套标签)的长形式,而我只是出于想法。

在此先感谢。

回答

0

如果你需要指定的DataContext为切换按钮只为IsSelected财产,如果你的列表总是包含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里面网格

+0

我们最终做的是实现[]索引器与名称的字符串,并重构xaml使用它。该列表包含两个以上的项目,我们不控制数字索引(NHibernate的b/c)。 – dythim