当涉及列表/集合时,我无法理解如何应用MVVM模式.
假设MainModel有一些属性和方法,以及包含其他DetailModel对象的列表.该DetailModel对象可以被添加,删除或重新排序.
该MainView会显示相关的根模式中的一些控制,并有ListBox从列表填充.每个项目都有自己的子视图DetailModelView UserControl.
最后,有一个MainViewModel.这个属性由MainModel属性和方法支持,绑定到主视图,更改通知保持所有内容同步.(到目前为止,我对这种模式感到满意 - 如果有一些我缺少的基本内容,请更多说明这一点......)
在处理列表时,我感到困惑.我遇到了几个例子,其中MainViewModel简单地公开DetailModels了视图的列表,并且DetailModelViews直接绑定到模型.这个功能,但是有问题.它并不一贯遵循模式(不DetailViewModel存在),它促使我在我的细节模型中包含一些与UI相关的代码.我觉得MainViewModel应该公开一个DetailViewModelsUI 的列表来绑定,但我仍然坚持如何实现这样的事情!
应该如何管理两个列表(DetailModels和DetailViewModels)?我真的很困惑,因为我最初填充DetailViewModel列表,以及我应该如何处理添加,删除或更改项目的顺序,以保持它们同步!
我开始在我的WPF应用程序中使用ValidationRules,但很困惑.
我有以下简单的规则:
class RequiredRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (String.IsNullOrWhiteSpace(value as string))
{
return new ValidationResult(false, "Must not be empty");
}
else
{
return new ValidationResult(true, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在XAML中使用如下:
<TextBox>
<TextBox.Text>
<Binding Path="Identity.Name">
<Binding.ValidationRules>
<validation:RequiredRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
这大多数工作正如我所料.我很惊讶地看到我的源属性(Identity.Name)没有被设置; 我有一个永远不会看到变化的撤销功能,除了重新输入它之外没有办法恢复该值(不好).
Microsoft的数据绑定概述描述了底部附近的验证过程,这很好地解释了这种行为.基于此,我想让我的ValidationStep设置UpdatedValue.
<validation:RequiredRule ValidationStep="UpdatedValue"/>
Run Code Online (Sandbox Code Playgroud)
这就是我的事情变得奇怪的地方.而不是使用对象值调用Validate()作为设置的属性值(即字符串),我得到了System.Windows.Data.BindingExpression!我没有在Microsoft的文档中看到任何描述此行为的内容.
在调试器,我可以看到源对象(DataContext的TextBox),导航路径的特性,并看到该值已被设定.但是,我没有看到在验证规则中找到正确属性的任何好方法.
注意:使用ValidationStepas ConvertedProposedValue,我得到输入的字符串(我没有使用转换器),但它也会在验证失败时阻止源属性更新,如预期的那样.有了CommittedValue,我得到了BindingExpression而不是字符串. …
在我的应用程序中,我经常创建新的视图和ViewModel,但持久保存相同的模型.例如,我可能会在主窗口中显示项目列表的简单视图,并具有另一个窗口,其中包含任何特定项目的更多详细信息.可以随时打开和关闭详细信息窗口,也可以同时打开列表中不同项目的多个窗口.
因此,给定模型对象可以有多个ViewModel,并且需要使用其他位置的更改进行更新.(我正在使用INotifyPropertyChanged我的模型.)当我完成它时,我想摆脱ViewModels,即,当详细信息窗口关闭时.
public DetailViewModel(MyDetailModel detailModel)
{
// Retain the Detail Model
this.model = detailModel;
// Handle changes to the Model not coming from this ViewModel
this.model.PropertyChanged += model_PropertyChanged; // Potential leak?
}
Run Code Online (Sandbox Code Playgroud)
据我所知,事件处理程序将使Model保留对ViewModel的引用,并防止它被垃圾收集.
1)这是正确的吗?如何判断这些引用是否仍然存在?
2)我应该如何确定不再需要ViewModel并取消订阅事件?
我已经使用MVVM-Light成功使用了一些自定义命令,但我希望我的应用程序能够响应标准的ApplicationCommands,而不仅仅是在Window级别,而是在详细的项目级别.
我有一个TreeView我希望能够复制和粘贴节点.每个TreeViewItem都有自己的ViewModel,它们通过HierarchicalDataTemplatesXAML 显示,因为有几种不同的类型.我已经在我的ViewModel类上实现了复制,粘贴以及CanCopy和CanPaste的方法.如果合适的话,我可以很容易地实现指向这些的MVVM-Light RelayCommands,但这似乎不对.
我想使用菜单,Ctrl + C和Ctrl + V或最终的上下文菜单来访问命令.我也不想破坏我的UI中其他元素的复制/粘贴功能,例如TextBoxes.为此目的使用内置的ApplicationCommands似乎是合适的.但是,我只看到在UserControl代码隐藏中处理这些示例.我没有(或需要)UserControl,也不是真正关注MVVM.
有没有办法可以绑定ApplicationCommand.Copy和ApplicationCommand.Paste命令我的ViewModel,即在数据模板中?
我有一个带有枚举属性的模型(在这种情况下,与出口管制条例有关).当向用户显示值时,我想显示相应的字符串.有时这是在ComboBox中(用户可以选择一个值),有时它在TextBlock中(它是只读的).
示例:for ExportRegulationType.EAR,我想显示"EAR",而for ExportRegulationType.DoNotExport,我想要显示"Do Not Export".请注意,我没有任何语言本地化需求,但我认识到这个问题......
目前,在我的ViewModel中,我有一个属性,它返回一个基于当前枚举值的字符串,以及另一个返回一个的属性Dictionary<ExportRegulationType, string>.对于ComboBoxes,我可以绑定ItemsSource到dictionary属性,对于TextBlocks,我可以绑定到string属性.这有效,但有点笨拙.
两个问题:
1)在我看来,我应该能够申报词典(与键和值),如XAML(可能在App.xaml中)的静态资源,并使用了的ItemsSource的组合框的版本.但是,我无法弄清楚如何声明和引用这样的东西.我怎样才能做到这一点?
2)假设上面已经到位,我认为我也可以设置与textblock的绑定,因此基于enum属性,它将在字典中查找字符串.
我已经看到以下与静态或动态枚举值有关的问题.第一个是不够的,第二个没有回答......
这些应该只是一个XAML,并且可以让我从我的ViewModel中删除方法(只有一个暴露的ExportRegulationType枚举属性.这些可能吗?
编辑:附加信息:
在应用程序中,我将有许多不同的视图,模型和ViewModel.但是,由于出口管制法规是一个共同且一致的要求,我使用组合来保持干燥.即,模型A和B都具有ExportControl模型.ViewModels A1,A2,B1和B2将具有ExportControlViewModel.视图将具有绑定到其ViewModel的ExportControlViewModel的控件.视图将具有ComboBox或TextBlock,但不能同时具有两者(取决于用户是否可以更改值).
我正在使用 STM32 系列复习微控制器。(特别是使用 STM32F072BDISCOVERY 板)。
我在理解计时器的使用及其各种模式时遇到了一些麻烦。具体来说,“输出比较”(OC)模式有很多选项,“PWM”模式有其他选项。RM0091 参考手册的编写好像它们是两种不同的交替操作模式。我也在使用新的 HAL 驱动程序,并且有不同的 API 可以使用 OC 与 PWM。
但是,在我看来,PWM 基本上是输出比较功能的子集/用例,其中定时器通道配置为直接驱动硬件输出。
我缺少的 OC 和 PWM 模式之间是否有明确的区别?PWM 波形生成以何种方式不是输出比较功能?