2009-08-31 10 views
2

私はここで困惑しています。ビジネスオブジェクトを保持する観測可能なコレクションがあります。 ListBoxのItemsSourceにバインドされています。私は自分のオブジェクトのXとYを更新しています。ランタイム中にUI上に正しく表示されています。しかし、問題がどこにあるのかここにあります。私はまた、テキストブロックのテキストプロパティで表示されるいくつかのデータをバインドして、データは初期値のみを表示します。テキストブロックテキストを何度変更しても、テキストブロックテキストは更新されません。ObservableCollectionのアイテムがビューを更新していません

ここにXAMLがあります。 XAMLに問題がある場合は、教えてください。私が言ったように、X/Y - Top/Leftバインディングはうまく動作し、変更されたときに更新されますが、DisplayDataにバインドされているTextBlockはそうではありません。

また、私のコレクションの私のビジネスオブジェクトは、INotifyPropertyChangedを実装しています。

XAMLを見るだけで回答が得られない場合は、これを複製するための小さなデモを作成しようとします。

<Window x:Class="Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="614" Width="674"> 

<ListBox Name="PlottingBox" Background="White"> 

    <ListBox.ItemTemplate> 

     <DataTemplate> 

      <TextBlock Text="{Binding Path=DisplayData}" /> 

     </DataTemplate> 

    </ListBox.ItemTemplate> 

    <ListBox.Template> 

     <ControlTemplate TargetType="{x:Type ListBox}"> 

      <Border Background="{TemplateBinding Background}" 

       BorderBrush="{TemplateBinding BorderBrush}" 

       BorderThickness="{TemplateBinding BorderThickness}"> 

       <Canvas IsItemsHost="True" /> 

      </Border> 

     </ControlTemplate> 

    </ListBox.Template> 

    <ListBox.ItemContainerStyle> 

     <Style TargetType="{x:Type ListBoxItem}"> 

      <Setter Property="Canvas.Left" Value="{Binding Path=PlotX}" /> 

      <Setter Property="Canvas.Top" Value="{Binding Path=PlotY}" /> 

     </Style> 

    </ListBox.ItemContainerStyle> 

</ListBox> 

答えて

5

を反映するために更新することができるようにあなたのビジネスオブジェクトは、私は、問題がコードであると考え、INotifyPropertyChangedインタフェースを実装する必要があります後ろに。あなたのXAMLは絶対に合法であり、よく見えます。あなたは毎回DisplayData値が変更されたPropertyChangedイベントを上げる

  1. あなたのビジネス・オブジェクトがINotifyPropertyChangedインターフェイスを実装して:あなたは、ソースコードを投稿する前に、しかし、以下の条件が満たされていることを確認してください。

  2. タイプミスはありません。 DipslayDataプロパティー定義でも、 "DispayData"プロパティー名を渡すPropertyChangedEventArgsでもありません。

  3. ListBoxItemのDataContextは、ビジネスオブジェクトの型です。それをSnoopで確認してください。

  4. 実行時にバインドエラーはありません。デバッグでアプリケーションを実行し、出力ウィンドウを確認します。 Snoopでこれをチェックすることもできます。

このチェックリストを完了したら、あなたに答えがあります。

乾杯:)

+0

アンバカ、これを見ていただきありがとうございます。 1.はい。 2.チェックマークを付けてOKをクリックします。 3.まだ確認していません。 4.バインドエラーはありません。 この状況を再現するために小さなアプリケーションを作成しましたが、小さなアプリケーションは完全に機能します。だからあなたは絶対に正しいです、それは私のコードビハインドになければなりません。私はコードを精査して報告する。 もう一度ありがとうございます。 – Doug

+0

あなたは正しいです。問題は私のコードビハインドにありました。 STUPD、STUPIDの問題。 Sub Newの後にDisplayDataを更新することはありませんでした。 DOH!私はあなたの時間を無駄にして申し訳ありません。 Doug – Doug

+0

私はあなたが答えを見つけてうれしいです:)。おめでとう! – Anvaka

1

UIが変更が通知され、新しい値

+1

はい、私は上記のとおりです。 – Doug

0

オム、リストボックス内部のDataContextは、のItemsSourceリストの項目です。

たとえば、ListBoxがObservableCollectionにバインドされている場合、ListBox内のDataContextは親のデータコンテキストではなくPersonオブジェクトになります。

バインディングを持つTextBlockがある場合、バインディングはPersonオブジェクトを指します。つまり、parentDC.DisplayDataではなくpersonInstance.DisplayDataです。

ItemsSourceがないと動作がわかりません。

あなたはこれを知っているかもしれませんが、おそらくこれが役立ちます。

関連する問題