【问题标题】:Problem databinding a custom control in silverlightSilverlight 中的自定义控件数据绑定问题
【发布时间】:2009-09-22 15:00:33
【问题描述】:

我正在尝试在 Silverlight 3 中对自定义控件进行数据绑定,但遇到了奇怪的问题。

我的用户控件 xaml 是这样的:

<UserControl x:Class="StronicoMain.GenericSmallIcon"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" >
    <Canvas x:Name="canGSI">

    </Canvas>
</UserControl>

用户控件的代码隐藏是这样的

私有字符串_EntityTypeID;

    public string EntityTypeID
    {
        get
        {
            return _EntityTypeID;
        }

        set
        {
            _EntityTypeID = value;
        }
    }

    public GenericSmallIcon()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(Page_Loaded);
    }        
    public void Page_Loaded(object sender, RoutedEventArgs e)
    {
        icoMale icoMale = new icoMale();
        icoFemale icoFem = new icoFemale();

        if (EntityTypeID == null)
        {
            canGSI.Children.Add(icoMale);
        }
        else if (EntityTypeID == "1")
        {
            canGSI.Children.Add(icoMale);
        }
        else if (EntityTypeID == "2")
        {
            canGSI.Children.Add(icoFem);
        }
        else
        {
            canGSI.Children.Add(icoMale);
        }            
    }

我从 DataGridSelection Adapter 调用它(取自 AutoCompleteBox-Datagrid 版本的 Microsoft Toolkit 示例页面)- 相关部分如下所示:

<Stron:DataGridSelectionAdapter x:Name="SelectionAdapter" AutoGenerateColumns="False" IsReadOnly="False">
                                                    <Stron:DataGridSelectionAdapter.Columns>
                                                        <data:DataGridTemplateColumn>
                                                            <data:DataGridTemplateColumn.CellTemplate>
                                                                <DataTemplate><Stron:GenericSmallIcon EntityTypeID="{Binding EntityTypeID}"></Stron:GenericSmallIcon></DataTemplate>
                                                            </data:DataGridTemplateColumn.CellTemplate>
                                                        </data:DataGridTemplateColumn>
                                                            <data:DataGridTextColumn Header="Contact Name" FontWeight="Bold" Foreground="#CC000000" Binding="{Binding EntityName}" />
                                                        <data:DataGridTextColumn Header="Tags" Binding="{Binding EntityTags}" />                                                        
                                                    </Stron:DataGridSelectionAdapter.Columns>
                                                </Stron:DataGridSelectionAdapter>

我运行代码,我收到错误“ManagedRuntimeError #4004” - 如果我在手动设置数据绑定时尝试使用自定义控件,它工作得很好,如果我尝试依赖正在数据绑定的值我得到错误。如何在自定义控件上创建自定义数据绑定事件?我认为这是问题所在,在将值传递给它之前页面正在加载。

谢谢大家。

~史蒂夫


更新,这是根据接受的答案更改的有效代码

public static readonly DependencyProperty EntityTypeIDProperty = DependencyProperty.Register("EntityTypeID", typeof(string), typeof(GenericSmallIcon), new PropertyMetadata(new PropertyChangedCallback(GenericSmallIcon.OnEntityTypeIDPropertyChanged)));
public string EntityTypeID
{
    get { return (string)GetValue(EntityTypeIDProperty); }
    set { SetValue(EntityTypeIDProperty, value); }
}
private static void OnEntityTypeIDPropertyChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    GenericSmallIcon control = d as GenericSmallIcon;
    string b = (string)e.NewValue;
}

【问题讨论】:

  • 你能发布你的错误的内部异常消息吗?

标签: silverlight data-binding custom-controls


【解决方案1】:

这是无效的:

&lt;Stron:GenericSmallIcon EntityTypeID="{Binding EntityTypeID}"/&gt;

问题是您不能绑定到不是依赖属性的属性。请参阅此 MSDN article 关于将您的 POCO 属性转换为依赖项属性的信息。

-马克

【讨论】:

  • 感谢 Mark 消息实际上没有附加链接,仅供参考。
  • 对不起。添加了链接。如果你绑定它,它必须是一个 DP!
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多