- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 MVVM 模式编写一个应用程序。我通过将 View 的 DataContext 属性设置为 ViewModel 的实例来向 View 提供数据。一般来说,我只是从那里使用 Binding 并继续我的方式。
最近,我尝试实现一个 ComboBox,其中包含一个超出 ViewModel 提供的“选择项”集合之外的“额外”元素。
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding MyItemsCollection}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
问题是,CompositeCollection 不是 Freezable:Freezable Objects Overview 。这会导致仅出现静态 ComboBoxItem,而不会出现绑定(bind)表达式的任何结果。
我对这个问题的最初 react 是实现我自己的 Freezable 版本的 CompositeCollection。但这引出了以下问题:
为什么 CompositeCollection 不是 Freezable?
我担心的是,通常这些决定都是有原因的,而且我觉得我对 Freezable 的了解不够,无法说明为什么它们不继承它。我知道我可以实现这个集合,但我担心如果我这样做的话,性能会出现明显的差异。
如有任何帮助,我们将不胜感激。谢谢!
另外:请注意,我意识到我可以插入 Null 或其他一些特殊值,并提供模板或值转换器来执行我想要的操作。这不是我感兴趣的问题...只是上面粗体的问题。
更新:
经过 ArsenMkrt 的评论进行了一些进一步的研究,我相信这实际上是一个疏忽。证据是这样的:
FreezableCollection<T>
。它不会生成 CollectionViews,这使得它不适合我的直接需求。我当前解决此问题的计划是创建一个具有 CompositeCollection 和 FreezableCollection<T>
属性的新集合。 。我不知道它是否会起作用,但我正在考虑这样的事情:
public class BindableCompositeCollection : FreezableCollection<object>, ICollectionViewFactory
如果有人有更好的选择,我很想听听!
最佳答案
我今晚刚刚尝试过:
public class State
{
public string Code { get; set; }
public string Name { get; set; }
}
public class MyWindowViewModel
{
ObservableCollection<State> _states = new ObservableCollection<State>
{
new State { Code = "FL", Name = "Florida" },
new State { Code = "CA", Name = "California" },
};
public ObservableCollection<State> States
{
get
{
return _states;
}
}
}
<Window x:Class="WpfApplication1.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:WpfApplication1"
Title="Window1"
Height="300"
Width="300">
<Window.Resources>
<app:ServiceLocator x:Key="Locator" />
</Window.Resources>
<StackPanel>
<ComboBox x:Name="TestCombo" SelectedIndex="0" DisplayMemberPath="Name" SelectedValuePath="Code">
<ComboBox.ItemsSource>
<CompositeCollection>
<app:State Code="" Name="Select a state..." />
<app:State Code="TX" Name="Texas" />
<CollectionContainer Collection="{Binding Source={StaticResource Locator}, Path=MyWindowViewModel.States}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
</StackPanel>
</Window>
这里的关键是创建服务定位器的实例作为静态资源,然后通过它来访问 View 模型。服务定位器可以使用 Unity 或任何您想要的 DI 连接到 ViewModel 的实例。
编辑:
实际上,在我的 silverlight 应用程序中,我在 App.xaml 中创建服务定位器作为静态资源,然后将我的其他 UserControls/Windows/Pages DataContext 绑定(bind)到服务定位器的 ViewModel 属性。即使服务定位器是在 App.xaml 的资源中实例化的,它对于组合框仍然应该以相同的方式工作。我希望有一个我可以使用的 CompositeCollection 的 silverlight 版本。这对于我正在开发的应用程序非常有用。 :(
关于wpf - 为什么 CompositeCollection 不可 Freezable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189052/
文档说 克隆-“创建 System.Windows.Freezable 的可修改克隆,进行深度复制对象的值。复制对象的依赖属性时,此方法复制表达式(可能不再解析)但不复制动画或它们的当前值。” 克隆当
这个问题在这里已经有了答案: How to freeze freezable objects that cannot be frozen (1 个回答) 关闭 1 年前。 我正在为我的 WPF 应用
我试过 MSDN,但没有从 Freezable 派生的例子。 更新: 是的,在 MSDN 中有一个带有动画的示例,但它太复杂了。 需要更简单的东西来理解freezable。 最佳答案 文档 在 MSD
WPF - 我正在使用 BackgroundWorker 创建一个 Model3D 对象,但是当我想将它添加到 XAML 中定义的 Model3DGroup 时,出现异常: Cannot use a
我正在使用 MVVM 模式编写一个应用程序。我通过将 View 的 DataContext 属性设置为 ViewModel 的实例来向 View 提供数据。一般来说,我只是从那里使用 Binding
我有一个工作 custom markup extension它以特定方式从 DataContext 中检索信息(对于这个问题不重要)。 一切都很好,直到我在不属于可视树或逻辑树的元素中使用此标记扩展。
我有一个 wpf 表单,我想在用户从控件中做出选择时立即显示加载弹出窗口,因为数据加载可能需要很长时间才能看到,因为数据库不是本地的。在我为弹出窗口创建线程之前,我已经完成了所有工作。 这是我创建线程
我有一个类库项目,我在其中为我的 WPF 应用程序和 RIA 服务保留了一些接口(interface)和类。 进入我要添加成员的类(class)之一 Brush BackgroundColor { s
WPF/Silvellight 中的“可卡住”子类型是什么? 最佳答案 可卡住对象是一种具有允许您“卡住”它的机制的对象。这会锁定所有状态并使对象不可变。这使得对象的使用性能更高,并且在线程之间共享更
这两者有什么区别?它们在语义上不是等价的吗? 最佳答案 没有。 Freezable.IsFrozen 可以通过调用 Freeze() 方法从类外部切换(一次),DependencyObject.IsS
我在开发 WPF 应用程序时遇到了一个问题。该应用程序基于 Prism。应用程序使用 prism bootstraper 和在加载任何窗口之前,应用程序会在不同的线程 (STA) 上打开一个模式对话框
我一直在研究并发性,并从更“线程安全”的角度看待事物。 WPF(或者实际上是 System.Windows.Freezable 等)有一个 freezable 类,它可以提供“冰棒不变性”。有没有人尝
我在 Brushes.xaml 中有这个: 并在 Generic.xaml 中像这样使用它: 问题是 wpf 卡住了画笔,所以
我正在做一个使用 Leaflet map 服务的 Angular 项目。我遇到了集群问题。我想切换集群并为此找到了一个包,其中包含启用/禁用集群功能的方法:Leaflet.MarkerCluster.
我对此感到非常困惑,它开始让我质疑我对 WPF 资源系统的整体理解 我有一个多窗口应用程序,其中每个 Window 派生对象都在具有单独调度程序的单独线程上运行。 Thread t = new Thr
我是一名优秀的程序员,十分优秀!