2016-09-27 5 views
0

コードビューからUserControlのバインドされたオブジェクト(listView itemsourceから生成)にアクセスしようとしています。私は、ユーザーコントロールが、それはすなわち、から値をだなっていることをCustomerオブジェクトにアクセスしたい、gereratedされている各ユーザーコントロールでWPFリストビューバインド - コード内でバインドされた項目を取得

<ListView x:Name="lst1"> 
    <ListView.ItemTemplate> 
     <Controls:MyUserControl /> 
    </ListView.ItemTemplate> 
<ListView> 

public void Load() 
{ 
    lst1.ItemsSource = List<Customer> from database ...... 
} 

私は、次のコードを持っています:

public MyUserControl() 
{ 
    InitializeComponent(); 

    Customer cust = (Customer)this.DataContext; 
    // cust is null???? 
} 

このコードは、Customerオブジェクトのプロパティを正常に表示しますが、コードbええ。

助けてください。

答えて

2

実際にコンパイラはobjectにキャストなしでCustomerを割り当てますか?

とにかく、DataContextはまだコンストラクタでは初期化されません。

あなたはDataContext変更はいつでも発生しますDataContextChangedイベント、扱うことができる - それはMyUserControlを作成DataTemplateをインスタンス化の過程で割り当てられているときに、この場合には、それはおそらくだろうが。そしてそれはあなたが欲しいものです。

あなたがそれを使用する必要がある時はいつでもXAML

<UserControl 
    ... 
    DataContextChanged="MyUserControl_DataContextChanged" 
    ... 

C#

private Customer _customer; 
void MyUserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    _customer = (Customer)DataContext; 
} 

それとも、ただCustomerDataContextを唱えられます。もちろん、nullを確認してください。あなたはCustomerであなたが何をしているのかを言わなかったので、何かをする必要がある時を確かめるのは難しいです。

+0

ありがとうございます。私はキャストで質問を更新しました。 – Noobie3001

+0

短くて甘い答えをありがとう。私は、DataContextが構築後まで利用できないことを知らなかった。私は後でセーブが行われるまでそれを使用するつもりはありませんでした。多くはもう一度ありがとう。 – Noobie3001

+1

@ Noobie3001それを考えると、コンストラクタが完了するまで、誰もそれに何かを割り当てることはできません。新しいクラスインスタンス自体は、それだけでDataContextの値を得ることができます。パラメータをコンストラクタに渡します。しかし、そのコンストラクタにはパラメータはありません。 –

関連する問題