【问题标题】:WPF Design Time Data not binding when class has default constructor当类具有默认构造函数时,WPF 设计时数据未绑定
【发布时间】:2015-10-04 08:20:57
【问题描述】:

我正在尝试在 WPF 中绑定设计时数据。我有一个 viewModel,我的设计时数据类继承自 View Model。我正在像这样在类的构造函数中填充我想在设计时看到的数据

public class SalesModelDesignTimeData : SalesModel
{
    public SalesModelDesignTimeData()
    {

        Items.Add(new SaleItem { Sku = "001", Title = "Pepsi", CostPrice = 10.0, Quantity = 1 });
        Items.Add(new SaleItem { Sku = "002", Title = "Coca Cola", CostPrice = 10.0, Quantity = 1 });
        Items.Add(new SaleItem { Sku = "003", Title = "Colgate Tooth Paste", CostPrice = 8.0, Quantity = 1 });
        Items.Add(new SaleItem { Sku = "004", Title = "Lipton Yello Label", CostPrice = 12.5, Quantity = 1 });
        Items.Add(new SaleItem { Sku = "005", Title = "Sugar", CostPrice = 5.0, Quantity = 1 });
    }
}

这里是 XAML

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:designData="clr-namespace:Tienda.UI.DesignTimeData"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" x:Class="Tienda.UI.Views.Sales"
    Title="Sales" d:DesignWidth="775"
d:DataContext="{d:DesignInstance designData:SalesModelDesignTimeData,IsDesignTimeCreatable=True}">
<Grid >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>

    <DataGrid HorizontalAlignment="Left" DataContext="{Binding Items}"/>
    <TextBlock Text="{Binding Test}" Grid.Row="0" Grid.Column="1" />
</Grid>

我面临的问题是 VS 在我设置 d:DataContext 的 XAML 文件中给了我一个“对象引用未设置为对象错误的实例”

如果我从我的类中删除构造函数,那么错误就会消失并且它的绑定似乎可以工作。

谁能告诉我我做错了什么?

【问题讨论】:

  • d 是一个命名空间,但您访问并分配了这个d:DataContext,这很奇怪。左侧应该是属性、依赖属性或字段,但所有这些成员都属于 class 或对象。那么这里的DataContext(用于d:DataContext)到底是什么?它肯定不是属性、dependencyProperty 或字段。
  • @Hopeless 我还是 WPF 新手,所以也许我犯了一个错误,但是在线阅读文章这似乎是绑定设计时数据的方法,就像这里提到的 msdn.microsoft.com/en-us/magazine/dn169081.aspx
  • 从您的链接看起来DataContext 是一个属性,但我仍然从未使用过类似的东西,它是某种编辑器的约定/语言,而不是访问元素的正确逻辑。如果DataContext 是属性d:DataContext 仍然是对类的访问,所以看到这个d:DataContext=... 有点混乱和无意义。也许这是一种在 XAML 中为某些元素设置属性的方法。

标签: c# wpf xaml data-binding


【解决方案1】:

没必要这么废话

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

正如用户在评论中绝望的解释。

这将起作用,并且是要走的路。

<Window.DataContext>
            <designData:SalesModelDesignTimeData />
</Window.DataContext>
...

<DataGrid HorizontalAlignment="Left" ItemsSource="{Binding Items}"/>

//在你评论他仍然看不到设计时数据后完成代码

MainWindow.xaml

<Window x:Class="WpfDataControls.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfDataControls"
        Title="MainWindow" Height="350" Width="525">

    <Window.DataContext>
        <local:SalesModelDesignTimeData />
    </Window.DataContext>

    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <DataGrid HorizontalAlignment="Left" ItemsSource="{Binding Items}"/>
        <TextBlock Text="{Binding Test}" Grid.Row="0" Grid.Column="1" />
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfDataControls
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();            
        }
    }

    public class SalesModelDesignTimeData : SalesModel
    {
        public SalesModelDesignTimeData()
        {
            Items.Add(new SaleItem { Sku = "001", Title = "Pepsi", CostPrice = 10.0, Quantity = 1 });
            Items.Add(new SaleItem { Sku = "002", Title = "Coca Cola", CostPrice = 10.0, Quantity = 1 });
            Items.Add(new SaleItem { Sku = "003", Title = "Colgate Tooth Paste", CostPrice = 8.0, Quantity = 1 });
            Items.Add(new SaleItem { Sku = "004", Title = "Lipton Yello Label", CostPrice = 12.5, Quantity = 1 });
            Items.Add(new SaleItem { Sku = "005", Title = "Sugar", CostPrice = 5.0, Quantity = 1 });
        }
    }

    public class SalesModel
    {
        public List<SaleItem> Items { get; set; }

        public SalesModel()
        {
            Items = new List<SaleItem>();
        }
    }

    public class SaleItem
    {
        public string Sku { get; set; }
        public string Title { get; set; }
        public double CostPrice { get; set; }
        public int Quantity { get; set; }
    }

}

【讨论】:

  • 我删除了 d 命名空间并像你提到的那样限制了数据,但它仍然给我同样的错误“对象引用未设置为对象的实例”。我认为您需要包含上述命名空间,因为我只想在设计时而不是在运行时绑定数据?
  • 如果您在 xaml 中定义静态资源或数据上下文,则它在设计时可用。我在检查其准确性后发布答案。我将发布相同的屏幕截图。等等。
  • 完美运行!谢谢安君!你的方式更简单,更清洁。标记为答案。
  • 你是什么意思“不需要那个废话”?这就是您使用设计时数据的方式。您似乎建议将数据上下文简单地设置为设计时数据,这也将在运行时应用。
  • 您应该更好地使用 d:DataContext 并在 designinstance 上绑定,就像这里解释的 stackoverflow.com/a/16402388/3111930 这样您就不会因为不必要地创建 Designtime 类的实例而污染正在运行的应用程序。
【解决方案2】:

事实证明,我发布的代码运行良好。

这个链接帮助我解决了这个问题。

WPF/MVVM setting UserControl.DataContext in XAML results in Object reference not set?

我的构造函数正在创建对象链,其中之一是抛出异常。一旦我解决了这个问题,设计时绑定就开始起作用了。

【讨论】:

  • 我试图让设计时数据出现的方式也有效,但下面 Anjum 的回答更简洁,效果也很好,所以我接受了他的回答,并将使用该技术来绑定设计时数据。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2010-10-24
  • 2018-04-08
相关资源
最近更新 更多