- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为概念验证,我正在将我们的 WPF 应用程序的一些 View 和 View 模型转换为 Catel。
其中一个用户控件似乎在运行时没有正确绑定(bind)到 View 模型。我想我明白为什么会这样,但想得到一些关于什么是最好的补救措施的反馈。
编码
我有一个简单的 View ,其模型实际上是 ObservableCollection
:PersonTable.xaml
需要注意的关键事项:我使用的是 CollectionViewSource
包装了 DataGrid
的主要集合绑定(bind)到。这样我就可以保持网格自动排序。
<catel:UserControl x:Class="MyApp.PersonTable"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:catel="http://catel.codeplex.com"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="200" d:DataContext="{DynamicResource DesignTimeViewModel}">
<UserControl.Resources>
<ResourceDictionary>
<CollectionViewSource Source="{Binding PersonItems}" x:Key="PersonItemsSource">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="DOB" Direction="Descending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<ui:DesignPersonViewModel x:Key="DesignTimeViewModel" />
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<DataGrid ItemsSource="{Binding Source={StaticResource PersonItemsSource}}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}"
Header="Name" Width="90"
ElementStyle="{StaticResource CellRightAlign}" />
<!-- etc..... -->
</DataGrid.Columns>
</DataGrid>
</Grid>
</catel:UserControl>
PersonTableViewModel.cs
using Catel.MVVM;
public class PersonTableViewModel : ViewModelBase
{
public PersonTableViewModel(ObservableCollection<Person> personItems)
{
this.PersonItems = personItems
}
public ObservableCollection<Person> PersonItems
{
get { return GetValue<ObservableCollection<Person>>(PersonItemsProperty); }
set { SetValue(PersonItemsProperty, value); }
}
public static PropertyData PersonItemsProperty =
RegisterProperty("PersonItems", typeof(ObservableCollection<Person>), () => new ObservableCollection<PersonItems>());
}
PersonItems
的控件。属性不是可视化树的一部分,而是嵌入在控件级资源字典中?根据我对文档的阅读,特别是文章
UserControl - Under the hood , 看来Catel
UserControl
类将 View 模型注入(inject)为隐藏的内部
DataContext
仅在可视化树内,但我的
{Binding}
在资源字典项目中可能会被冷落。
CollectionViewSource
到后面的代码;将其公开为依赖属性。我不喜欢这个选项,因为我不能在 XAML 中配置它。 CollectionViewSource
到 View 模型。我真的不喜欢这个;将 WPF 组件放在 View 模型中会破坏 MVVM。 CollectionViewSource
转至原文DataContext
(即模型)。那里的问题是设计时 View 模型将无法正确绑定(bind)。<CollectionViewSource Source="{Binding}" ..... >
---- PersonTable.xaml.cs ----
[ViewToViewModel(MappingType = ViewToViewModelMappingType.ViewModelToView]
public ObservableCollection<PersonItem> PersonItems { get { ... } }
---- PersonTable.xaml ----
<CollectionViewSource Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PersonTable}}, Path=PersonItems}" ...... >
最佳答案
你的假设都是正确的。但是还有第四个补救措施。将 Resources 放入 Grid 中,以便您位于 ViewModel 数据上下文中:
<catel:UserControl x:Class="MyApp.PersonTable"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:catel="http://catel.codeplex.com"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="200" d:DataContext="{DynamicResource DesignTimeViewModel}">
<Grid>
<Grid.Resources>
<ResourceDictionary>
<CollectionViewSource Source="{Binding PersonItems}" x:Key="PersonItemsSource">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="DOB" Direction="Descending" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<ui:DesignPersonViewModel x:Key="DesignTimeViewModel" />
</ResourceDictionary>
</Grid.Resources>
<DataGrid ItemsSource="{Binding Source={StaticResource PersonItemsSource}}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name, Mode=TwoWay}"
Header="Name" Width="90"
ElementStyle="{StaticResource CellRightAlign}" />
<!-- etc..... -->
</DataGrid.Columns>
</DataGrid>
</Grid>
</catel:UserControl>
关于wpf - 从 Catel WPF UserControl 中的 ResourceDictionary 中绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31488173/
然后我修改“ProductName”并按“取消”按钮属性重置为传递的参数。但是,如果我修改 ProgramIds(添加或删除)并按“取消”按钮,则集合未设置为通过。为什么? 我在 ViewModel
我试图在 Catel 的 viewModel 上实现验证。 我阅读了文档,它看起来很简单,但不知何故,我可能在这种特殊情况下遗漏了一些东西。我有一个用户控件,其中嵌套了两个用户控件。一个是我将用作自定
目前正在学习 Catel。 在 Catel.Examples 的 PersonApplication 中 - 特别是 PersonWindow.xaml:设计时数据未在 Visual Studio 设
我有一个简单的 WPF 应用程序,我使用 Catel (3.5) 框架来使用 MVVM。Visual Studio 中 Catel 的默认结构是: Solution: Project: F
因此,上周我才刚开始使用Catel,但是我无法让选项卡式界面正常工作。我一直在使用以下资源,将选项卡式界面用于MVVM(https://catelproject.atlassian.net/wiki/
我只是一个初学者,问一个简单的问题。只需要一个移动的方向。有人可以用很少的话解释使用 WPF+MVVM 模式(使用 Catel)和 Entity Framework 创建的数据库的应用程序开发过程。1
例如,我有3个角色:管理员,开发人员,项目经理。 如果我想为除以下以外的所有用户禁用控件 管理员,我会写: 效果不错 但是,如果我想为管理员和项目经理启用控制(2个或更多角色),而为
我尝试在 Catel 的命令中使用参数: public Command MyCommand { get; private set; } MyCommand = new Command(MyComman
我尝试在 Catel 的命令中使用参数: public Command MyCommand { get; private set; } MyCommand = new Command(MyComman
我有一个简单的 ViewModel,它有两个 Models。所以它看起来像这样: public class ConnectionItemSelectorViewModel : ViewModelBas
我有一个带有“MainView”和一些嵌套 View 的 Catel 应用程序。 嵌套 View 具有 ListView一些项目有 ContextMenu与一些 MenuItems . 在 MainV
我正在使用 Catel、MVVM、WPF,并且想知道如何使用嵌套/分层数据。 假设从数据库中我有一个客户列表,每个客户都有一个发票列表,每个都有一个 InvoiceItems 列表。客户拥有许多 In
我正在构建具有多个模块的应用程序。每个模块都包含一个 View 模型和 View 。 我想创建解决方案,以便在我的应用程序的一部分中自动显示 SelectedModule。 假设我有这样的 MainW
我正在开发一个使用 Catel 的 MVVM (4.0.0) 实现的程序。我有一个模型类,它作为一些业务逻辑 - 它必须遵守关于它的属性值之一的规则。 例如,假设我有一个 Trap具有 TargetV
我无法让 Xamarin.Forms 和 Catel 一起工作。 我看到了 sample但它似乎已经过时了。 当我通过 NuGet 下载 Catel 时,我会遇到不同版本的不同问题: v5.1: 编译
是否可以结合MahApps的视觉风格,包括窗口的风格,但是Catel的View和ViewModel?它们都需要继承窗口(查看) 最佳答案 查看 MahApps shell为 Orchestra . 关
我有一个包含多个 DataTemplate 的 View 。每个 DataTemplate 都有一个 View 和 ViewModel,如下所示:
我是一个相当新手的 Visual Basic 开发人员,试图在我正在开发的 MVVM 应用程序中使用 MultiSelectTreeView 控件 (https://github.com/ygoe/M
我是 catel 和 mvvm 的新手。我已经成功地以“catel”方式构建了一个示例应用程序,并且我喜欢我确实需要的所有附加功能(感谢您提供的精彩教程)。我已经使用典型的 mvvm 和 3rd 方控
我正在分析一个使用 Catel 作为 MVVM 框架的 WPF 应用程序,我已经看到在 ViewModel 中我有 2 个保留路径作为 现在我在附加到上下文菜单的行为中创建了这样的 RadMenuIt
我是一名优秀的程序员,十分优秀!