2009-06-15 6 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> 

Contolコード:

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になっていますので、古いバージョンのベータ版で作業する理由は何ですか? –

答えて

0

ユーザーコントロールのdatacontextには、Dataプロパティがありません。

データプロパティを持たないので、データバインディングはすでにデフォルト値であるnullを返すので、プロパティの変更は決して実行されません。

+0

私はこれを取得しません。なぜデータプロパティを持つ必要があるのですか?すべてのDCにDataプロパティがあるわけではありません。 VMクラスにはすべてDataプロパティがありません。私は、子クラスのDCに何もバインドしていません。 – Noam

+0

あなたはバインディングデータ を持っています。これは、Dataプロパティを探すように指示しています。それは1つを見ず、あなたはnull値で終わり、何もしません。 – zachary