Silverlight中的自定义属性绑定
时间:2020-03-05 18:42:39 来源:igfitidea点击:
我的项目中有两个Silverlight控件,它们都具有TeamId属性。我想在托管两个用户控件的控件中的XAML中将它们绑定在一起,类似于:
<agChat:UserTeams x:Name="oUserTeams" /> <agChat:OnlineUser x:Name="oOnlineUsers" TeamId="{Binding ElementName=oUserTeams, Path=TeamId}" />
在第一个控件中,我正在实现System.ComponentModel.INotifyPropertyChanged并在TeamId属性更改时引发PropertyChanged事件。
在第二个控件中,我使用了propdp片段将TeamId标识为Dependency属性。
// Using a DependencyProperty as the backing store for TeamId. This enables animation, styling, binding, etc... public static readonly DependencyProperty TeamIdProperty = DependencyProperty.Register( "TeamId", typeof(string), typeof(OnlineUsers), new System.Windows.PropertyMetadata(new System.Windows.PropertyChangedCallback(TeamChanged)));
但是,当第一次创建silverlight控件时,我从Silverlight获得了following异常:
Unhandled Error in Silverlight 2 Application Invalid attribute value {Binding ElementName=oUserTeams, Path=TeamId} for property TeamId. [Line: 21 Position: 146] at System.Windows.Application.LoadComponent(Object component, Uri xamlUri) at agChat.Page.InitializeComponent() at agChat.Page..ctor() at agChat.App.Application_Startup(Object sender, StartupEventArgs e) at System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)
有什么想法我做错了吗?显然,这可以全部在后台代码中完成,但这似乎是正确的方法。
解决方案
回答
在WPF中,这是正确的方法,但在Silverlight中则不是。
我们无法在Silverlight中使用xaml绑定到元素。
这是违规行:
TeamId =" {绑定ElementName = oUserTeams,Path = TeamId}"
具体来说是ElementName
如果可以的话,请将数据对象放入"资源"中并在那里声明,然后可以执行以下操作:
<agChat:UserTeams x:Name="oUserTeams" DataContext="{StaticResource myDataObject}" /> <agChat:OnlineUser x:Name="oOnlineUsers" DataContext="{StaticResource myDataObject}" TeamId="{Binding TeamId}" />