2009-06-15 6 views
0

Je travaille avec Silverlight 3 beta et j'ai un problème. J'ai une page qui a un contrôle d'utilisateur que je worte dessus. Le contrôle utilisateur possède une propriété de dépendance. Si le contrôle utilisateur ne définit pas un contexte de données (d'où le contexte de données du parent), tout fonctionne correctement. Mais si le contrôle utilisateur a son propre contexte de données, la méthode OnPropertyChanged de la propriété de dépendance n'est jamais appelée.Propriétés de dépendance et contexte de données dans Silverlight 3

Voici un exemple:

Ma page principale:

<UserControl x:Class="TestDepProp.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:app="clr-namespace:TestDepProp" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="100"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <Border BorderBrush="Blue" BorderThickness="3" CornerRadius="3"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Text="Enter text here:" /> 
        <TextBox x:Name="entryBlock" Text="{Binding Data, Mode=TwoWay}"/> 
        <Button Content="Go!" Click="Button_Click" /> 
        <TextBlock Text="{Binding Data}" /> 
       </StackPanel> 
       <Border BorderBrush="Blue" BorderThickness="3" CornerRadius="3" Margin="5"> 
        <app:TestControl PropOnControl="{Binding Data}" /> 
       </Border> 
      </StackPanel> 
     </Border> 
    </Grid> 
</UserControl> 

principal Code Page:

using System.Windows; 
using System.Windows.Controls; 

namespace TestDepProp 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
      MainPageData data = new MainPageData(); 

      this.DataContext = data; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      int i = 1; 
      i++; 
     } 
    } 
} 

Page principale du contexte de données:

using System.ComponentModel; 

namespace TestDepProp 
{ 
    public class MainPageData:INotifyPropertyChanged 
    { 

     string _data; 
     public string Data 
     { 
      get 
      { 
       return _data; 
      } 
      set 
      { 
       _data = value; 
       if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Data")); 
      } 
     } 

     public MainPageData() 
     { 
      Data = "Initial Value"; 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 
} 

contrôle XAML:

<UserControl x:Class="TestDepProp.TestControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:app="clr-namespace:TestDepProp" 
    > 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <StackPanel Orientation="Vertical" Margin="10" > 
      <TextBlock Text="This should change:" /> 
      <TextBlock x:Name="ControlValue" Text="Not Set" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

Code contôle:

using System.Windows; 
using System.Windows.Controls; 

namespace TestDepProp 
{ 
    public partial class TestControl : UserControl 
    { 
     public TestControl() 
     { 
      InitializeComponent(); 
      // Comment out next line for DP to work 
      DataContext = new MyDataContext(); 
     } 


     #region PropOnControl Dependency Property 

     public string PropOnControl 
     { 
      get { return (string)GetValue(PropOnControlProperty); } 
      set { SetValue(PropOnControlProperty, value); } 
     } 

     public static readonly DependencyProperty PropOnControlProperty = 
        DependencyProperty.Register("PropOnControl", typeof(string), typeof(TestControl), new PropertyMetadata(OnPropOnControlPropertyChanged)); 

     private static void OnPropOnControlPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      TestControl _TestControl = d as TestControl; 
      if (_TestControl != null) 
      { 
       _TestControl.ControlValue.Text = e.NewValue.ToString(); 
      } 
     } 
     #endregion PropOnControl Dependency Property 

    } 
} 

contexte de données de contrôle:

using System.ComponentModel; 

namespace TestDepProp 
{ 
    public class MyDataContext : INotifyPropertyChanged 
    { 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 
} 

Pour l'essayer, tapez quelque chose dans la zone de texte et cliquez sur le bouton Go. Commentez le contexte de données dans le code de contrôle pour voir qu'il commence à fonctionner.

J'espère que quelqu'un a une idée de ce qui se passe.

+0

Cela n'a rien à voir avec votre question, mais je me demande pourquoi vous travaillez avec Silverlight 3 Beta? Silverlight est maintenant sur la version 5, alors pourquoi travailler sur une version bêta d'une ancienne version? –

Répondre

0

Le datacontext du contrôle utilisateur n'a pas de propriété Data. Étant donné qu'il n'a pas de propriété de données, la liaison de données renvoie null, qui est déjà la valeur par défaut, de sorte que le changement de propriété ne se déclenche jamais.

+0

Je ne comprends pas. Pourquoi a-t-il besoin d'avoir une propriété de données. Tous les contrôleurs de domaine n'ont pas de propriété Data. Toutes mes classes VM n'ont pas de propriété Data. Je ne lie même pas n'importe quoi au DC sur la classe d'enfant. – Noam

+0

où vous avez des données de liaison il lui dit de rechercher une propriété de données. Il n'en voit pas et vous vous retrouvez avec une valeur nulle et cela ne fait rien. – zachary

Questions connexes