0

WPFアプリではListView

<ListView Height="100" Width="434" x:Name="lvItems" ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}" >
 <ListView.View>
  <GridView>
   <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Date}"/>
   <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/>
   <GridViewColumn Header="Description" Width="200" DisplayMemberBinding="{Binding Description}"/>
  </GridView>
 </ListView.View>

ObservableCollectionこれはデータバインディングを介して接続されています:

ObservableCollection<ShowsQu> _ShowQuCollection =
    new ObservableCollection<ShowsQu>();

public ObservableCollection<ShowsQu> ShowQuCollection
{ get { return _ShowQuCollection; } }

public class ShowsQu
{
public string ShowCode { get; set; }
public DateTime Date { get; set; }
public TimeSpan Time { get; set; }
public string Description { get; set; }
}

これObservableCollectionは、同じウィンドウの分離コードファイルに配置されます。ここで、ListViewはですMainWindow。すべてが正常に動作します。

ここで、別のウィンドウにさらに別のウィンドウを追加ListViewしましたが、この場合、データバインディングは機能していません。私が変更しなかったXAMLのこのデータバインディング部分:

ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}

で接続するために、このListViewデータバインディング宣言(ListViewで)をどのように変更する必要がありますか?SecondWindowObservableCollectionMainWindow

4

2 に答える 2

4

ElementNameバインディングは、現在のウィンドウでのみ表示されます。バインディングソースまたは(より可能性が高い)ローカルDataContextを他のウィンドウに明示的に設定する必要があります。

ただし、より良いアプローチは、ShowQuCollectionをWindowクラスから削除し、それを別の「ビューモデル」クラスの一部にすることです(非ビジュアル、データのみ)。次に、両方のWindowsに同じDataContext(ビューモデルクラスのインスタンス)を持たせることができ、ElementNameバインディングを使用する必要はまったくありません。ElementNameバインディングは通常、実際のデータを参照する方法としてではなく、UIの別のコントロールに依存する場合(たとえば、PanelのVisibilityをCheckBoxのIsCheckedにバインドする場合)に使用されます。

于 2010-01-03T23:26:06.043 に答える
0

「異なるウィンドウ」が異なるクラスを意味する場合は、2番目のウィンドウのDataContextを最初のウィンドウのdatacontextと同じに設定する必要があります。

于 2010-01-03T23:19:56.957 に答える