Silverlight PropertyGrid类绑定

时间:2011-10-14 17:32:30

标签: silverlight data-binding propertygrid

我知道有第三方Silverlight属性网格(实际上我的公司拥有一个)所以请不要建议第三方控件:我想了解更多关于xaml中绑定的问题。

我正在编写一个Silverlight前端作为标志外观来启动SSRS和基于php的报告。

我创建了一个包含报告信息的Report类,它有一个参数集合,其中包含有关运行报告时需要填写的参数的信息。

我的计划是创建一个绑定到Report的Parameters集合的silverlight属性网格。

这是一个更简单的类版本:

    public class Report
    {        

        public int ReportId { get; set; }
        public string ReportName { get; set; }
        public string Description { get; set; }

        private List<ReportParameter> _Parameters = new List<ReportParameter>();

        public List<ReportParameter> Parameters
        {
            get { return _Parameters; }
            set { _Parameters = value; }
        } 
}

public class ReportParameter
{
        public int ReportId { get; set; }
        public string ParameterName { get; set; }
        public string DataTemplateName { get; set; }
        public bool IsRequired { get; set; }
}

我希望使用DataTemplateName的{​​{1}}属性绑定到数据模板:例如,如果我有一个日期参数,我希望能够设置{{1} }然后ReportParameter并让该行使用参考资料中定义的DataTemplateName="MyDatePicker"来编辑参数值。

这是我用来尝试让它工作的一些XAML:

DataTemplate={StaticResource {Binding DataTemplateName}}

谢谢!

1 个答案:

答案 0 :(得分:1)

我明白了 - 借助Silverlight论坛上的精彩常见问题解答:

http://forums.silverlight.net/p/95440/218611.aspx

Silverlight没有WPF所做的DataTemplateSelector类,这可以解决问题。

标题为

的部分

7.1 Silverlight尚不支持WPF的哪些数据绑定功能?有解决方法吗?

对于DataTemplateSelector功能,有一个简单的解决方法。

所以这就是我在代码示例中修复它的方法:

使用以下内容替换列表框:

<ListBox  ItemsSource="{Binding Parameters}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <ContentControl Content="{Binding}" Loaded="ContentControl_Loaded"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

然后在后面的代码中填写ContentControl_Loaded事件:

 private void ContentControl_Loaded(object sender, RoutedEventArgs e)
        {
            ContentControl cc = (ContentControl) sender;
            XReportParameter p = (XReportParameter)cc.DataContext;
            cc.ContentTemplate = (DataTemplate)this.Resources[p.DataTemplateName];
        }

效果很好!