1

私はこのチュートリアルに従って、XML、WPF、および C# (Fortran から派生したもの) を理解しようとしています。(チュートリアルのおかげで) 機能が動作するようになりましたが、WinForms の代わりに WPF で動作するように変更するのに問題があります。

基本的に、「Get RSS」ボタンをクリックすると、次のことが起こっています。

RssManager reader = new RSSManager();
ObservableCollection<Rss.Items> _list = new ObservableCollection<Rss.Items>();
reader.Url = txtFeed.Text;
reader.GetFeed();
_list = (ObservableCollection<Rss.Items>)reader.RssItems;

リストビューは空白のままです。そのコードは次のようなものです。また、リストボックスでこれを試すと、データではなくリスト内の各項目にクラスの名前が入力されます。

<ListView ItemsSource="_rssItems">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
        </GridView>
    </ListView.View>
</ListView>

次のようなことは可能でしょうか (ここでも、私の無知を許してください):

_list.Add( new Rss.Items());

リスト (_list) には、必要なすべての情報が含まれています。ListView に適切にバインド (または追加) する方法を知りたいだけです。

4

2 に答える 2

1

少し迷っているようです。

最終的には、ビュー (WPF フォーム) を View-Model にバインドし、View-Model をモデル (RSSManager) にバインドします。

とりあえず、ビューをモデルに直接バインドしましょう。

コンストラクターで、モデルの新しいインスタンスを作成し、それをデータ コンテキストに割り当てます。

このモデルはフォームが続く限り存続します -

    public MainWindow()
    {
        InitializeComponent();
        _model = new RssManager();
        DataContext = _model;

    }

次に、XAML でアイテム ソースをコレクション プロパティにバインドします。

       <ListView ItemsSource="{Binding Path=RssItems}">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Title}"/>
                </GridView>
            </ListView.View>
        </ListView>

"Path=RssItems" は、DataContext に割り当てたものに対して相対的であることに注意してください。

次に、更新ボタンのロジックで次のように呼び出します。

_model.Url = txtFeed.Text;
_model.GetFeed();

最終的にやりたいことは、中間に別のレイヤーを配置することです。これがビューモデルです。ビューのモデルは、ご想像のとおりです。

ビュー モデルの仕事は、ビューの状態に関する情報を収集し、ビューによって提示されるモデルからデータを公開することです。また、現在の UI 状態情報 (テーブル内のどの行が選択されているか) を保持することもできます。本質的に、ビューのすべてのロジックをコードから抽象化できます。コマンドは、どのタイプのコントロールが選択されたかに関係なく、どの行が選択されたかなどに作用します。

于 2012-07-22T00:28:18.550 に答える
0

Leeがコメントで示唆しているように、ListViewのItemsSourceプロパティのバインディングは正しくないようです。プロジェクトがどのように設計/構造化されているかに応じて、これにアプローチする方法は複数あります。

DataBindを実行するには、ListViewに何らかのDataContextが必要です。これは、(名前が示すように)Bindingのコンテキストの一種です。MVVMを使用している場合、ほとんどの場合、ウィンドウ/コントロール全体のDataContextはViewModelになります。その場合、次のようにViewModelのプロパティにバインドします。

<ListView ItemsSource="{Binding RssItems}">...</ListView>

これは、パブリックRssItemsプロパティ(ある種のList / Enumerable)を持つViewModelがあり、ViewModelがDataContextであることを前提としています。

MVVMを使用していない場合は、DataBindingを使用する場合と使用しない場合の両方でItemsSourceを割り当てる方法がたくさんあります。DataBindingに完全に慣れていない場合、私が提案できる最も簡単な方法は、次のように手動でItemsSourceを割り当てることです。

Xaml:

<ListView x:Name="MyRssList">...</ListView>

コードビハインド(UIがロードされた後、および_listを作成/入力した後):

MyRssList.ItemsSource = _list;

これはDataBindingを使用しませんが、ジョブを実行します。DataBindingから始めたい場合は、次のようにすることができます。

XAML:

<ListView x:Name="MyRssList" ItemsSource="{Binding}>...</ListView>

コードビハインド:

MyRssList.DataContext = _list;

これにより、ListがListViewのDataContextとして割り当てられ、次に、ItemsSourceプロパティがDataContextにDataBindされます。

全体として、あなたは正しい方向に進んでいます。DataBindingMVVMについて読むことをお勧めします。MVVMは、WPFの強力なDataBinding機能を活用するための非常に優れた方法であり、DataBindingを十分に理解することは、優れたWPFアプリを設計および構築する上で非常に重要です。

お役に立てれば。幸運を!

于 2012-07-22T00:35:30.720 に答える