Привязка пользовательского атрибута в Silverlight
-
09-06-2019 - |
Вопрос
В моем проекте есть два элемента управления Silverlight, оба имеют свойства TeamId.Я хотел бы связать их вместе в XAML в элементе управления, в котором размещены оба пользовательских элемента управления, похожие на:
<agChat:UserTeams x:Name="oUserTeams" />
<agChat:OnlineUser x:Name="oOnlineUsers" TeamId="{Binding ElementName=oUserTeams, Path=TeamId}" />
В первом элементе управления я реализую System.ComponentModel.INotifyPropertyChanged и вызываю событие PropertyChanged при изменении свойства TeamId.
Во втором элементе управления я использовал фрагмент propdp, чтобы идентифицировать TeamId как свойство зависимости.
// 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:
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.
Вы не можете привязываться к элементам с помощью xaml в Silverlight.
Это оскорбительная строка:TeamId="{Binding ElementName=oUserTeams, Path=TeamId}"
В частности, имя элемента
Если вы можете поместить объект данных в ресурсы и объявить его там, вы можете сделать это:
<agChat:UserTeams x:Name="oUserTeams"
DataContext="{StaticResource myDataObject}" />
<agChat:OnlineUser x:Name="oOnlineUsers"
DataContext="{StaticResource myDataObject}"
TeamId="{Binding TeamId}" />