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}" />

在视图模型构造函数中,我调用数据库并填充集合并设置属性。在您的示例中,您似乎正在创建一个Linq将返回多个项目 ( IEnumerable<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>

请查看 Josh Smith 的带有模型-视图-视图模型设计模式的 WPF 应用文章,了解有关 MVVM 的更多信息。

于 2013-08-23T09:58:06.507 回答