Pergunta

Eu tenho dois controles Silverlight em meu projeto, ambos possuem propriedades TeamId.Gostaria de vinculá-los em XAML no controle que hospeda ambos os controles de usuário semelhantes a:

        <agChat:UserTeams x:Name="oUserTeams" />
        <agChat:OnlineUser x:Name="oOnlineUsers" TeamId="{Binding ElementName=oUserTeams, Path=TeamId}" />

No primeiro controle, estou implementando System.ComponentModel.INotifyPropertyChanged e gerando o evento PropertyChanged após a alteração da propriedade TeamId.

No segundo controle, usei o snippet propdp para identificar o TeamId como uma propriedade de dependência.

        // 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)));

No entanto, quando os controles do Silverlight são criados pela primeira vez, recebo a seguinte exceção do 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)

Alguma idéia do que estou fazendo de errado?Obviamente, tudo isso poderia ser feito em code-behind, mas isso parece como a abordagem correta.

Foi útil?

Solução

Essa é a abordagem correta no WPF, mas não no Silverlight.

Você não pode vincular elementos usando xaml no Silverlight.

Esta é a linha ofensiva:TeamId="{Binding ElementName=oUserTeams, Path=TeamId}"

Especificamente ElementName

Se puder, coloque o objeto de dados em Recursos e declare-o lá, então você pode fazer isto:

<agChat:UserTeams x:Name="oUserTeams" 
       DataContext="{StaticResource myDataObject}" />
<agChat:OnlineUser x:Name="oOnlineUsers" 
       DataContext="{StaticResource myDataObject}" 
       TeamId="{Binding  TeamId}" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top