Wpf 如何减少单选按钮绑定代码?

Wpf 如何减少单选按钮绑定代码?,wpf,xaml,data-binding,radio-button,Wpf,Xaml,Data Binding,Radio Button,我在关注,但如果我有几个TabItems,每个都有10x10网格的单选按钮,有没有办法摆脱一些样板文件?按原样,每个单选按钮都必须包含所有这些信息: <RadioButton IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=FavoriteColor, Converter=

我在关注,但如果我有几个TabItems,每个都有10x10网格的单选按钮,有没有办法摆脱一些样板文件?按原样,每个单选按钮都必须包含所有这些信息:

<RadioButton 
    IsChecked="{Binding  
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},  
        Path=FavoriteColor,
        Converter={StaticResource IntToBoolConverter},
        Mode=TwoWay,
        ConverterParameter=5}" 
    Content="Red" Grid.Column="4" Grid.Row="6" />


我希望能够在TabControl中设置一次RelativeSource、Converter和Mode,在每个TabItem中设置一次Path,并且每个RadioButton只设置ConverterParameter。这在XAML中可能吗?如果不是,那么在codebehind中执行会更有意义吗?

这里将改进,利用
列表框的单一选择模式:

<ListBox SelectionMode="Single" SelectedItem="{Binding EnumValue}"
        Style="{StaticResource BorderlessStyle}">
    <ListBox.Resources>
        <ObjectDataProvider x:Key="items" MethodName="GetValues"
                            ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MainWindow+TestEnum" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </ListBox.Resources>
    <ListBox.ItemsSource>
        <Binding Source="{StaticResource items}" />
    </ListBox.ItemsSource>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <!-- Automatic grid layout, adjust as needed -->
            <UniformGrid Columns="2" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <RadioButton Content="{Binding}"
                    IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

相关:(我使用
ItemsControl
的答案可能会有帮助,您可以使用
UniformGrid
作为面板)。@H.B.噢,这是否意味着我不仅可以摆脱绑定样板,还可以摆脱所有的RadioButton定义?我发现这也很有帮助:@H.B.你真是个了不起的朋友。我更喜欢:但我不能说重用ListBox实际上是相当狡猾的;)@奎扎尔卡特:你链接到一个问题,你指的是被接受的答案吗?如果是:这是一个非常糟糕的解决方案,因为1。由于所有的硬编码值和冗余(),尤其是对于大型枚举2,维护是一个噩梦。代码太长了。对不起,我参考了第二个答案,但粘贴了错误的链接。我无法修复该评论:/这不是一个坏的解决方案,而是另一种方法。您的解决方案并不更短,只需检查您必须在everwhere注入多少XAML行和列表框,而不是单行绑定+可重用转换器。您无法在窗口中自由分发收音机,必须将所有收音机都打包在列表框中(可忽略),可能会在单个收音机的手动造型等方面存在问题。您的方法可能是批量生产收音机的最佳选择。对于一些手动放置的收音机来说,它们是最好的。@Quetzalcatl:不管我的代码是否长,你可以很容易地将它提取到一个用户控件中,然后你可以用一行代码在任何地方创建单选按钮组。面板提供了足够多的关于分发的控制,所以手动放置对我来说似乎不是一个有效的观点,尤其是因为分散在一起的项是糟糕的UI设计。因此,我认为这是一个糟糕的解决方案,链接答案比公认答案的唯一优势是额外的类型安全性,而我的答案隐含了这一点。
<Style x:Key="BorderlessStyle" TargetType="ListBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <ItemsPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>