我正在尝试设置几个切换按钮的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(嵌套标记)的长形式,我只是出于想法。
提前致谢。
答案 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