2017-01-28 23 views
0

コードビハインドで定義されたプロパティと同じテンプレートのクラスで定義されたプロパティをデータ型でバインドしたいとします。コードビハインドで定義されたプロパティと同じテンプレート内のクラスで定義されたプロパティをバインドする

私のクラス:

public class MyClass 
{ 
    public string name { get; set; } 

    public MyClass(string name) 
    { 
     this.name=name; 
    } 
} 

コードの背後にある:明らかに最初のTextBlockは何の問題もありません。この場合

public string name2; 
public MyView() 
{ 
    this.InitializeComponent(); 
    name2 = "Tim"; 
} 


<DataTemplate x:Key="MasterListViewItemTemplate" x:DataType="model:MyClass"> 
    <StackPanel> 
     <TextBlock Text="{x:Bind name}"/> 
     <TextBlock Text="{x:Bind name2}"/> 
    </StackPanel> 
</DataTemplate> 

は、ここでの例です。 2番目のTextBlockがコードビハインドを参照し、MyClassを参照しないことを希望します。

どうすればいいですか?

+0

* MyClass *に2番目のプロパティ 'name2'を定義しないのはなぜですか? – Romasz

+0

これは問題のほんの一例ですが、name2はMyClassのプロパティではありません。 – Andrea485

答えて

0

2番目のTextBlockのdatacontextを現在のウィンドウに設定する必要があります。 私は、これはバインディング式でMYVIEWをxこの

<TextBlock DataContext="{Binding ElementName=MyView, Path=.}" Text="{x:Bind name2}" /> 

のようなバインディング式を使用することによって達成することができると思う:MYVIEWウィンドウのNameプロパティ。

EDIT(WPF):この結合もResourceDictionaryのエントリ

<TextBlock DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=.}" Text="{Binding name2}" /> 

そして、重要な何かのために働く必要があり、私はあなたの例ていることがわかり、name2のは、単にウィンドウのコンストラクタで定義されています。それを行う正しい方法は、このようになります。

public string name2 { get; set; } 

public MyView() 
{ 
    this.InitializeComponent(); 
    this.name2 = "Tim"; 
} 

これが役立ちます。

+0

返信ありがとうございますが動作しません。 – Andrea485

+0

名前2は、Windowコードの背後にあるパブリックプロパティですか? –

+0

はいこれはエラーです:無効なバインディングパス 'name2':プロパティ 'name2'は 'MyClass'型では見つかりません。常にmyClassのプロパティを調べてください。 – Andrea485

0

次のことを試してください:あなたの分離コードのコンストラクタで

:あなたのXAMLで

public MyView() 
{ 
    this.InitializeComponent(); 
    this.DataContext = this; //set the datacontext here 
    name2 = "Tim"; 
} 

<TextBlock Text="{Binding DataContext.name2, ElementName=MyView}"/> 
+0

が動作しないthis.DataContext = this原因例外 'Throw:' System.InvalidCastException 'タイプ' MyPage 'タイプのオブジェクトを' MyClass 'にキャストできません – Andrea485

+0

その行にコメントした後に試してみることができますか?または、最初の提案がうまくいかない場合は、ページの 'DataContext'を' this'に更新してください。 –

0

まず、あなたは常に結合が自身のDataContextのを見て最初となした場合が指定されている場合は、DataContextが代入されるまで、所有者がツリーを所有者にトラバースします。次に、バインドするプロパティを探します。両方のテキストブロックに同じプロパティ名を設定し、他のバインディング手段を指定していないので、両方とも同じDataContext内のプロパティを探しています。言い換えれば、彼らはどちらもあなたのMyClassオブジェクトを見ています。

この作業を行うには、バインディングをより離散的に指定してプロパティを探す場所をバインディングに伝える必要があります。

<TextBlock Text="{Binding Name2, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" /> 

これはあなたのDataTemplateは、メインウィンドウのタイプであるオブジェクトに使用されていると仮定しています。あなたのものを手に入れよう。 (それは、これが最も簡単ですUIElementのだから。)

また、あなたがたDependencyPropertyことの背後にあるコードでプロパティを変更する必要があります

public string Name2 
    { 
     get { return (string)GetValue(Name2Property); } 
     set { SetValue(Name2Property, value); } 
    } 

    public static readonly DependencyProperty Name2Property = 
     DependencyProperty.Register(nameof(Name2), typeof(string), typeof(MainWindow)); 

あなたがこれを行う場合は、あなたのDataTemplateがその値にバインドします。

これは単なる質問に答えて、あなたがそれを理解するのに役立ちますが、私が個人的にDataTemplateをどのように設計するかは分かりません。

+0

UWPはAncestorTypeを実装していませんでした。Text = "{Binding name2、ElementName = MyView}"でも動作しません。 – Andrea485

+0

MyViewにもビューの名前を付ける必要があります。それは動作します。私は文字通りそれを確かめるためにそれをしました。 –

関連する問題