gpt4 book ai didi

c# - ItemsSource 不传播设计时数据上下文

转载 作者:行者123 更新时间:2023-11-30 20:47:41 25 4
gpt4 key购买 nike

我有一个包含项目数组的 View 模型:

public class FooViewModel
{
public FooListItem[] ListItems { get; set; }
...
}

我创建了一个子类作为设计时模拟,带有虚拟数据。

public class FooViewModelMock : FooViewModel
{
public FooViewModelMock()
{
ListItems = <test data population...>
...
}
}

然后我在窗口中连接模拟数据,效果很好。

<Window xmlns:mocks="clr-namespace:FooNS.Mocks"    
xmlns:models="clr-namespace:FooNS.Model"
d:DataContext="{d:DesignInstance Type=mocks:FooViewModelMock, IsDesignTimeCreatable=True}"> ...

然后在窗口中我有一个 DataGrid 并将 ItemsSource 绑定(bind)到 View 模型上的属性:

<DataGrid ItemsSource="{Binding ListItems}"> ...

测试数据在设计窗口中显示正常,但问题是 DataGrid 的数据上下文仍然是 FooViewModelMock,而不是 FooListItem,所以我失去了 intellisense 并收到类似“无法在数据上下文中解析属性 'xxx' 的消息输入“FooViewModelMock”。

我当然可以在 DataGrid 中设置数据上下文:

d:DataContext="{d:DesignInstance models:FooListItem}"

这让我恢复了智能感知,但我丢失了模拟数据。

有没有办法让设计时数据上下文通过 ItemsSource 绑定(bind)向下传播,并保留智能感知和设计 View 数据?

谢谢

最佳答案

据我所知,这是 Visual Studio 中的一个缺陷。以下是我的解决方法。

首先,我不使用 DesignInstance,因为我无法让它在 Visual Studio 2013 中工作。相反,我使用这个:

d:DataContext="{x:Static userControls:[ insert class name here ]DesignerData.Example}"

Example 是创建 ...DesignerData 类实例的静态属性。我不知道为什么会这样,但是 DesignInstance 应该做完全相同的事情,却没有。我已尝试指定 IsDesignTimeCreatable,但这没有帮助。

此类必须具有所需的集合属性,在我的例子中,它只返回匿名类型对象形式的数据:

public IEnumerable<object> Elements
{
get
{
return new object[]
{
new { ... },
new { ... },
new { ... }
};
}
}

在我的例子中,如果应用程序的其余部分不运行,通常无法轻松创建元素,因此使用像这样的匿名类型对象可以避免元素中的大量代码,让它们在设计时表现不同。

由于 Visual Studio 的缺陷,我们还必须具有元素的属性:

public string  Key   { get; private set; }
public Element Value { get; private set; }

但是请注意,这只是为了避免警告和自动完成。这些永远不会被实际阅读。

这种方法的一个很大的潜在缺点是,如果一个集合的元素具有与另一个集合中的元素同名但类型不同的属性,则不能使用它。

它也很笨拙和不方便,因为通常会有变通办法。

关于c# - ItemsSource 不传播设计时数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com