2009-06-15 47 views
0

我正在使用Silverlight 3测试版,并且遇到问题。我有一个拥有用户控件的页面,我可以在其上进行操作。用户控件具有依赖项属性。如果用户控件没有定义数据上下文(因此使用父级的数据上下文),所有工作都很好。但是,如果用户控件拥有自己的数据上下文,则依赖属性的OnPropertyChanged方法永远不会被调用。Silverlight 3中的依赖属性和数据上下文

这里有一个例子:

我的主页:

<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> 

主页代码:

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++; 
     } 
    } 
} 

主页的数据上下文:

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 
    } 
} 

控制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> 

控逆变代码:

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 

    } 
} 

控件的数据方面:

using System.ComponentModel; 

namespace TestDepProp 
{ 
    public class MyDataContext : INotifyPropertyChanged 
    { 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 
} 

要尝试一下,什么类型的文本框中,并点击Go按钮。注释掉控件代码中的数据上下文,以查看它开始工作。

希望有人对发生了什么有一个想法。

+0

这与您的问题无关,但我想知道您为什么使用Silverlight 3 Beta? Silverlight现在在版本5上,所以在旧版本的Beta版本上工作的原因是什么? – 2011-12-25 17:12:39

回答

0

用户控件的datacontext没有Data属性。

因为它没有data属性,所以databinding返回null,这已经是默认值,所以属性更改不会触发。

+0

我不明白。为什么它需要有一个数据属性。并非所有DC都具有Data属性。我所有的VM类都没有Data属性。我甚至没有将任何东西绑定到儿童班的DC上。 – Noam 2009-07-06 14:37:32