在Silverlight 2中....
我的xaml代码中有一个RadioButton,如下所示:
<RadioButton GroupName="Gender" Content="Male" IsChecked="{Binding Path=Gender, ConverterParameter=1, Mode=TwoWay, Converter={StaticResource RadioStringConverter}}" Width="49" HorizontalAlignment="Left"/>
这很有效。我的问题是尝试动态复制这个功能。
RadioButton rb = new RadioButton() {GroupName = "Gender", Content = "Male" ,Width = (double)49,HorizontalAlignment = System.Windows.HorizontalAlignment.Left};
这有效,但当我尝试将转换器放入时,它会中断。这样做的正确方法是什么?有什么好的工作实例吗?
这是我试过的......
RadioButton rb = new RadioButton() {GroupName = "Gender", Content = "Male" ,Width = (double)49,HorizontalAlignment = System.Windows.HorizontalAlignment.Left};
RadioStringConverter rsc = new RadioStringConverter();
Binding binding = new Binding(layout.FieldName) { Source = mainLayout.DataContext, Mode = BindingMode.TwoWay,ConverterParameter = 1,Converter = rsc}; // to emulate the "{StaticResource RadioStringConverter}"};
rb.SetBinding(RadioButton.IsCheckedProperty, binding);
sp.Children.Add(rb);
尽管编译得很好,但它无法正常运行。 1)如何动态引用静态资源? 2)如何动态地将此静态资源添加到XAML?现在我把这个参考硬编码了。
我是否比实际需要更难?
答案 0 :(得分:2)
发现解决方案.... 基本上我必须创建一个转换器类的实例,并将其接口传递给转换器:
Binding binding = new Binding(layout.FieldName) { Source = mainLayout.DataContext, Mode = BindingMode.TwoWay,ConverterParameter = 1,Converter = (rsc as IValueConverter)};
很高兴它变得简单而可行:)
答案 1 :(得分:0)
虽然有可能,正如您所知,您确定要动态创建RadioButton吗?
我去过那里......我写了完全相同的代码......但我很快意识到我做错了。在我的例子中,我使用了ItemsControl,并使用模板绑定了值...完全不需要自己动态创建它们。
我显然不知道更大的上下文,但考虑一下你是否应该使用某种动态容器更加声明性地做这件事。
实际上,在我发现MVVM之后,我完全消除了UI层对数据转换器的需求。数据转换器已经过时了MVVM:)