我有用户数组和角色数组。 我为每个用户呈现角色列表。 我想将复选框绑定到某个用户属性。
这是我的代码(第38行): https://gist.github.com/sadgb/30e2b75f2fff159bc26e#file-gistfile1-xml-L38
为什么这一行:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}, Path=DataContext}
...绑定到Role类,而不是绑定到User类?
绑定应该在第21行找到网格,其中DataContext的类型为User不是吗?
答案 0 :(得分:2)
还有另一种方式: - 1.给你的网格命名。 2.然后像这样绑定:
DataContext="{Binding ElementName=Gridname,Path=DataContext}"
以下是您编辑的代码:
<DataTemplate DataType="usersService:User">
<Grid Name="TheGrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding UserId}"/>
<telerik:RadListBox Grid.Row="1"
ItemsSource= "{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=users:UsersPage}, Path=RolesViewModel.Roles}" IsTextSearchEnabled="false">
<telerik:RadListBox.ItemTemplate>
<DataTemplate DataType="accessControlSubsystem:Role">
<StackPanel>
<CheckBox
IsChecked="{Binding ElementName=TheGrid,Path=DataContext , Converter={StaticResource CheckBoxToSelectedArrayConverter}, Mode=TwoWay}" Content="{Binding RoleName}" Tag="{Binding RoleId}" />
</StackPanel>
</DataTemplate>
</telerik:RadListBox.ItemTemplate>
</telerik:RadListBox>
</Grid>
</DataTemplate>
我想这可以解决你的问题或至少给你一个良好的开端。
我在代码中注意到的另一件事是你没有在相对绑定中指定属性名称:
IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}, Path=DataContext.PopertyName, Converter={StaticResource CheckBoxToSelectedArrayConverter}, Mode=TwoWay}" Content="{Binding RoleName}" Tag="{Binding RoleId}"
答案 1 :(得分:0)
您可以使用“ancestorLevel”
向上移动一级{Binding RelativeSource = {RelativeSource Mode = FindAncestor,AncestorType = Grid},AncestorLevel = 1,Path = DataContext}
奥利弗