4

ストアド プロシージャとエンティティ フレームワークを使用して、WPF の ListView にデータを読み込もうとしています。ユーザー コントロールを最初にロードすると、ListView はデータを正常にロードします。次に、同じコードを呼び出してデータを更新します。デバッグを通じて、ListItems の数が変化することを確認できますが、フロント エンド画面のデータは更新されません。

XAML

<ListView Name="DocsListView" ItemsSource="{Binding}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Documents" DisplayMemberBinding="{Binding Documents}"/>
        </GridView>
    </ListView.View>
</ListView>

コードビハインド

public void LoadDocs()
{
    Context _Context = new Context();
    DocsListView.ItemsSource = null;
    DocsListView.ItemsSource = _Context.SP_GetDocuments(1).ToList();
    _Context = null;
}

誰かが私が間違っていることを理解するのを手伝ってもらえますか? VS2012、.Net 4.5、および EF 5.0 を使用しています。

4

1 に答える 1

3

何が問題を引き起こしているのかわかりませんが、一般的には DependencyProperty を使用することをお勧めします!

しかし、次のように ListView を更新してみることができます。

ICollectionView view = CollectionViewSource.GetDefaultView(DocsListView.ItemsSource);
view.Refresh();

これがより大きなプロジェクトになる場合は、MVVM DesignPattern を確認することを強くお勧めします!

WPF と MVVMはうまく連携します。MVVMLightのように使用できる素敵なライブラリがあります。

また、INotifyPropertyChanged Interfaceも見てください。

XAML コード (DataContext の設定を忘れないでください)

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <ListView Name="DocsListView" ItemsSource="{Binding Data}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Documents" DisplayMemberBinding="{Binding Documents}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

C# コード ビハインド (アイテムが追加または削除されると、ObservableCollection は UI を自動的に更新します):

public ObservableCollection<YourEntity> Data
{
     get { return (ObservableCollection<YourEntity>)GetValue(DataProperty); }
     set { SetValue(DataProperty, value); }
}

// Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(ObservableCollection<YourEntity>), typeof(MainWindow), null);

public void LoadDocs()
{
     Context _Context = new Context();
     if(Data == null)
     {
         Data = new ObservableCollection<YourEntity>();
     }
     else
     {
         Data.Clear();
     }
     foreach(var doc in _Context.SP_GetDocuments(1).ToList())
     {
         Data.Add(doc);
     }
     _Context = null;
}
于 2013-10-03T17:09:41.727 に答える