2011-12-13 17 views
4

カスタムクラスにバインドする際に問題が発生しています。 dependencypropertyは私のviewmodelから正しい値を取得していないようです。ここに私のカスタムクラスがある:カスタムクラスのDependencyPropertyにバインド

public class DataResource : DependencyObject 
     { 

      public static readonly DependencyProperty ContentProperty = 
       DependencyProperty.Register("Content", 
        typeof(object), 
        typeof(DataResource)); 

      public object Content 
      { 
       get { return (object)GetValue(ContentProperty); } 
       set { SetValue(ContentProperty, value); } 
      } 

     } 

そして、私のUserControlのリソースでは、私が持っている:

<UserControl.Resources> 
     <local:DataResource x:Key="dataResource" Content="{Binding Test}"></data:DataResource> 
    </UserControl.Resources> 

「テスト」私のViewModelには、私は問題なくにラベルをバインドできるプロパティです。この実装で何か間違っていますか?

更新:私がDependencyObjectではなくFreezableから継承する場合、これが機能します。私はなぜ、どうしてもうまくいけば、これを説明できるとは思えない。 Resourcesにはコンテキストがありません

答えて

3

DataResourceは(ソースが定義されていない限りDataContextに対してである)結合が完了するように、それはDataContextを継承することができるどこかUserControlに配置する必要があります。

(運がよければそれで問題はそのプロパティがFrameworkElementに属しているようDependencyObjectDataContext「本物」を持っていないことを、人工的な文脈ががあります)

+0

私はFrameworkElementから拡張するために私のDataResourceクラスを変更した場合、私はまだコンテキストを持っていませんか?自分のリソース内でCollectionViewSourceを使用することができ、UserControlに既にDataContextが設定されているので、バインドは正常に機能します。 – dbomb7

+0

それは[継承コンテキスト](http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx)を介して動作するかもしれませんが、わかりません。しかし、型を 'FrameworkElement'に変更することは確かに正しい方法ではありません。実際のDataContextにバインドすることはできません。あなたは' ElementName'や 'Source'のような別のソースの使用を検討し、そのソースと比較して –

0

あなたはまたのFrameworkElementを使用することができます。コードの依存関係プロパティの.SetBindingメソッド。次に、ページ全体のデータコンテキストを設定する必要はありません(DataContextとDPは混在しないため)。ここで

は、MSDNはその上にある: http://msdn.microsoft.com/en-us/library/ms598273.aspx

サンプル:

MyData myDataObject = new MyData(DateTime.Now);  
Binding myBinding = new Binding("MyDataProperty"); 
myBinding.Source = myDataObject; 
myText.SetBinding(TextBlock.TextProperty, myBinding); 
+0

xamlではどのように見えますか? – dbomb7

+0

このメソッドは、XAMLバインディングを回避するために使用されます。私はバインディングコンフリクトやユーザーコントロール上でonchangedを適切にトリガしないDPのために、Silverlightでこれを多くやってしまいます。それはショットの価値があるが、コードの背後にある必要があります。 – Xcalibur37