0

WinForms から WPF への移行を試みており、正しい方法を学ぼうとしています。正しい MVVM モデルを使用したい。これは私の初めての WPF プロジェクトであり、linq の結果とのデータ バインディングに問題があります。コードビハインドでこれを非常に簡単に実行できること、またはカスタムオブジェクトを使用せずに、別のクラスを使用しながらlinqクエリからテーブル全体をデータグリッドに返すことができることを認識しています。しかし、私はこの形式に固執したいと思います。データテーブルを使用したくありません。

「ジョブ」テーブルを持つ dbml があるとします。列 "Job" (Linq はこの列の名前を Job1 に自動的に変更するようです)、"Customer"、および "Order_Date" を選択します。

これが私のコードです:

namespace Custom_Teplate.Model
{
    public class LINQResult 
    {
        public System.String JobNum
        { get; set; }
        public System.String CustomerName
        { get; set; }
        public System.DateTime Order_Date
        {get; set; }

        public static LINQResult Create()
        {
            DataDataContext dc = new DataDataContext();
            dynamic query = (from ddd in dc.Jobs
                             where (ddd.Status == "Active")
                             select new LINQResult
                             {
                                 JobNum = ddd.Job1,
                                 CustomerName = ddd.Customer,
                                 Order_Date = ddd.Order_Date,   
                             });
           return query;
        }
    }
}

名前空間を XMAL に追加します。

xmlns:c="clr-namespace:Custom_Teplate.Model"
<Window.Resources>
    <c:LINQResult x:Key="ResultListData" />
</Window.Resources>

そして、itemssource を次のように設定します。

ItemsSource="{Binding Source={StaticResource ResultListData}}
4

1 に答える 1

1

それは私がこれを行う方法ではありません。最初の間違いは、LINQResultクラスのインスタンスをResourcesセクションに追加したにもかかわらず、メソッドを呼び出していないため、そこにデータが含まれていないことですCreate。これは私がこれを達成する方法です:

Linq2SQLあなたの例のようにカスタムデータ型を使用してデータベースにアクセスしますが、違いは次のとおりです...ビューごとにビューモデルクラスがあります。ビュー モデル クラスには、UI に表示したいすべてのプロパティがあり、それらがコレクションであるか単一のアイテムであるかに関係ありません。ビュー モデル クラスINotifyPropertyChangedは、基本クラスを介してインターフェイスを実装します (これは必須です)。

さまざまなビューモデルをビューにリンクするようにDataTemplate設定したApp.xaml後、次のように UI にビューを表示できます。

<ContentControl Content="{Binding ViewModel}" />

ビュー モデル コンストラクターでは、データベースを呼び出してコレクションを埋め、プロパティを設定します。あなたの例では、複数のアイテム ( ) を返すクエリを作成しているように見えますが、メソッドからこれらのアイテムの 1 つだけを返そうとしています。LinqIEnumerable<LINQResult>Create

私は通常、コレクション クラスごとにクラスを拡張するObservableCollection<T>ので、私があなたなら、次のように作成します。

public class LinqResults : ObservableCollection<LinqResult> 
{
    public LinqResults(IEnumerable<LinqResult> linqResults) : base(linqResults) { }
}

次に、クエリ メソッドを次のように変更します。

public static LinqResults Create()
{
    DataDataContext dc = new DataDataContext();
    LinqResults linqResults = new LinqResults(
        from job in dc.Jobs
        where job.Status == "Active"
        select new LinqResult
        {
            JobNum = job.Job1,
            CustomerName = job.Customer,
            Order_Date = job.Order_Date,
        });
    return linqResults;
}

次に、ビュー モデルで、型のコレクション プロパティを追加LinqResultsし、INotifyPropertyChanged インターフェイスに「プラグイン」します。

public LinqResults LinqResults 
{
    get { return linqResults; }
    set { linqResults = value; NotifyPropertyChanged("LinqResults"); }
}

最後に、ビューでコレクションにバインドし、DataTemplateデータ型の を定義します (アクセスするために XML 名前空間を定義することを忘れないでください)。

    <ListBox ItemsSource="{Binding LinqResults}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type YourXmlNamespace:LinqResult}">
            <StackPanel>
                <TextBlock Text="{Binding JobNum}" />
                <TextBlock Text="{Binding CustomerName}" />
                <TextBlock Text="{Binding Order_Date}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

MVVM の詳細については、Josh Smith のWPF Apps With The Model-View-ViewModel Design Pattern の記事をご覧ください。

于 2013-08-23T09:58:06.507 に答える