WPF绑定从代码动态创建RadioButtons

时间:2016-05-12 21:03:20

标签: c# wpf data-binding user-controls

我有stackpanel我作为孩子动态添加RadioButtonsRadiobuttons的内容为整数。

我还有Y x Y网格(大小由代码动态确定),我动态添加按钮,允许用户将Button的内容更改为表示整数的字符串。

这是我需要帮助的地方:

从stackpanel检查任意单选按钮后,我希望网格中所有具有相同编号的按钮的背景颜色都会改变。

由于我是WPF的新手,我不确定如何实现这一点,我们将非常感谢您的帮助。

修改 我做了一点进步,我做的基本上是将Button.Content与RadioButton.IsChecked和RadioButton.Content绑定到每个按钮和每个单选按钮,但我有问题,它只适用于最后的radiobutton这里是代码(rbuts = radiobuttons的父控件,MyGrid =按钮的父控件):

for (int z = 0; z < boardSize * boardSize; z++)
        {

            Button b1 = MyGrid.Children[z] as Button;
            for (int i = 0; i < boardSize; i++)
            {
                MultiBinding rbtnBinding = new MultiBinding();
                rbtnBinding.Converter = new RadioButtonHighlightConverter();
                rbtnBinding.Bindings.Add(new Binding("IsChecked") { Source = rbuts.Children[i] });
                rbtnBinding.Bindings.Add(new Binding("Content") { Source = rbuts.Children[i] });
                rbtnBinding.Bindings.Add(new Binding("Content") { Source = MyGrid.Children[z] });
                rbtnBinding.NotifyOnSourceUpdated = true;
                b1.SetBinding(Button.BackgroundProperty, rbtnBinding);

            }

        }

就好像我不能为同一个按钮设置许多不同的多重绑定...

1 个答案:

答案 0 :(得分:0)

您可以将按钮样式放在资源字典中并绑定按钮的样式并使用转换器

<强> ButtonStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="ButtonStyle1" TargetType="Button">
        <Setter Property="Background" Value="Green"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>
    <Style x:Key="ButtonStyle2" TargetType="Button">
        <Setter Property="Background" Value="Red"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
</ResourceDictionary>

然后,对于具有此要求的Button,将Style绑定到感兴趣的属性

<Button ...
        Style="{Binding Path=MyDataProperty,
                        Converter={StaticResource ButtonStyleConverter}}"/>

在转换器中,您加载ButtonStyles资源字典并根据值

返回所需的样式
public class ButtonStyleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Uri resourceLocater = new Uri("/YourNameSpace;component/ButtonStyles.xaml", System.UriKind.Relative);
        ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater);
        if (value.ToString() == "Some Value")
        {
            return resourceDictionary["ButtonStyle1"] as Style;
        }
        return resourceDictionary["ButtonStyle2"] as Style;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

编辑:

添加了转换器参数的详细信息

<RadioButton Content="None"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <RadioButton.IsChecked>
        <Binding Path="MyProperty"
                 Converter="{StaticResource IntToBoolConverter}">
            <Binding.ConverterParameter>
                <sys:Int32>0</sys:Int32>
            </Binding.ConverterParameter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>