- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 UserControl,它将在我们开发的整个应用程序中重复使用。我们正在使用基于 MVVMLight 的框架。
为简单起见,假设用户控件仅包含一个文本框并公开一个名为“Quantity”的依赖属性。用户控件上的文本框数据绑定(bind)到依赖属性“数量”。
当在 View 上使用用户控件时,用户控件的“数量”依赖属性数据绑定(bind)到 ViewModel 中的属性。 (这个 ViewModel 是我们通过 MVVMLight ViewModelLocator 的 View 的数据上下文)。
这一切都很好!绑定(bind)有效,属性设置如我所料。在验证之前一切都很好。
我们正在使用 DataAnnotations 来装饰我们的 ViewModel 属性。 ViewModel 包含 INotifyDataErrorInfo 的自定义实现。我们为大多数输入控件实现了自定义样式,以在控件周围显示红色边框,并在控件旁边显示一条消息,显示验证错误消息。所有这些在正常情况下都很好用(例如, View 上的文本框绑定(bind)到 View 模型中的属性)。
当我使用此用户控件尝试相同的方法时,我最终得到的是整个用户控件周围的红色边框,并且实际文本框上没有错误指示。似乎 UI 中反射(reflect)了错误这一事实,但它只是没有进入我想要的控件。
我在 stackoverflow 上搜索了这个问题,在这些问题和解决方案中,似乎没有一个适合我的情况。
我的第一个猜测是,因为实际的文本框直接绑定(bind)到依赖属性本身,而不是我的 View 模型上的属性,所以它没有被正确地通知生成的错误。有什么方法可以通过用户控件将 View 模型中生成的错误传播到文本框吗?
如果您能提供任何帮助或建议,我们将不胜感激。
这是 UserControl xaml。
<UserControl x:Class="SampleProject.UserControls.SampleControl"
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"
mc:Ignorable="d" x:Name="sampleControl"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="LayoutRoot" DataContext="{Binding ElementName=sampleControl}">
<TextBox Text="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Width="100" Height="30" />
</Grid>
</UserControl>
背后的UserControl代码。
public partial class SampleControl : UserControl
{
public SampleControl()
{
InitializeComponent();
}
public static readonly DependencyProperty QuantityProperty =
DependencyProperty.Register("Quantity", typeof(int?), typeof(SampleControl),
new FrameworkPropertyMetadata{DefaultValue=null, BindsTwoWayByDefault = true});
public int? Quantity
{
get { return (int?)GetValue(QuantityProperty); }
set { SetValue(QuantityProperty, value); }
}
}
用于 View 。
<userControls:SampleControl Grid.Row="1" Quantity="{Binding Path=Quantity, ValidatesOnDataErrors=True}" Height="60" Width="300"/>
ViewModel 属性。
[Required(ErrorMessage = "Is Required")]
[Range(5, 10, ErrorMessage = "Must be greater than 5")]
public int? Quantity
{
get { return _quantity; }
set { Set(() => Quantity, ref _quantity, value); }
}
private int? _quantity;
(*注意,setter 中的 Set 方法只是基本 View 模型中的辅助方法,用于设置支持属性并为其引发 PropertyChanged 事件。)
最佳答案
尝试从 UserControl
中删除 DataContext
。不是设置它,而是使用 RelativeSource
Binding
直接从 TextBox
Bind
到实际属性:
<TextBox Text="{Binding Quantity, RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type YourControlNamespace:SampleControl,
ValidatesOnDataErrors=True}}}" Width="100" Height="30" />
更新>>>
否则,只要绑定(bind)到此属性的 View 模型总是具有要绑定(bind)到的同名属性,您就可以获得此Binding
像这样搜索 parent 的 DataContext
:
<TextBox Text="{Binding Quantity, RelativeSource={RelativeSource Mode=FindAncestor,
AncestorLevel=2, ValidatesOnDataErrors=True}}}" Width="100" Height="30" />
您需要将 2
更改为 TextBox
在到达具有正确属性访问权限的控件之前具有的正确数量的父元素。例如,使用级别 2
意味着框架将尝试在 DataContext 中找到名为
。 使用 Quantity
的属性以Bind
TextBox
父级的父控件的 AncestorLevel
时比较棘手,但我相信像 Grid
这样的“隐藏”元素不包括在父级中。
关于c# - 带有 MVVM 和 DataAnnotations 的 WPF,UserControl 中的验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215762/
您好,我的 WPF UserControl 知识只有一个小时了。因此,如果有很多关于这个问题的教程或/和答案,请原谅我(老实说,我认为这无法完成,需要重新编写代码……因此我想问的原因) 因此,在创建
我看过几篇文章介绍如何删除在运行时添加的 UserControl,但我的问题有点不同。我有一个 UserControl,它由一个图像组成,右上角有一个小“x”按钮,用于从其父 Canvas 中删除自身
我有一个用户控件 UserControl1,它在其资源中定义了一种样式。该用户控件包含一个 UserControl2 实例,它引用了该样式:
我正在尝试以 How can a WPF UserControl inherit a WPF UserControl? 中提到的方式继承 WPF 中的用户控件 namespace DMS.Presen
我想创建几个具有一些通用功能的 WPF UserControl 类。出于这个原因,我想从一个新的基类派生类,而这个基类又派生自 UserControl。 我的问题是我的 C# 类是 部分 定义的,而自
这个问题在这里已经有了答案: Should a user control have its own view model? (6 个答案) How to correctly bind to a de
我有一个 UserControl,它包含另一个带有 Button 的 UserControl。我想在第一个 UserControl(父级)中向该按钮添加一个事件。我尝试这样做: void Page_I
我需要我所有的用户控件都具有一些类似的功能。所以我的用户控件是: using System.Windows.Controls; namespace WpfApplication26 { ///
以下 WPF UserControl 调用了 DataTypeWholeNumber,它有效。 现在我想创建一个名为 DataTypeDateTime 和 DataTypeEmail 等的 UserC
我有一个包含按钮和其他一些控件的 UserControl: ... 当我创建该控件的新实例时,我想获取 Button 的 Command 属性: 当然,“Th
我不确定这个问题是否已经发布,并且我已经检查了建议的 SO 链接,但似乎没有一个链接与该问题完全相关。因此,如果有人认为这可能是重复的,请发布建议答案的链接并原谅这篇文章。 解决我的问题的方法可能不止
我在 UserControl_1 中有两个 UserControl,有一个按钮可以在 MainWindow.axml 中的 StackPanel 中添加 UserControl_2。我在 UserCo
我正在开发一个由多个传感器组成的模块化项目,每个传感器都继承自一个抽象的 Sensor 类。为了配置每个传感器,我已经开始为每个传感器添加一个用户控制面板(继承自 UserControl),它在运行时
我正在使用 c#.net 我的网络表单中有不同的 View ,除了三个文本框(到达/看到/离开时间)之外,这些通常都显示不同的信息。为了尝试减少代码,我创建了一个包含这三个文本框的 UserContr
我有一个 UserControl,它有两个组件 public System.Windows.Forms.ComboBox innerComboBox; public System.Windows.Fo
我有一个包含 ListBox 的 userControl。我想从另一个 userControl 访问那个 ListBox。 例如: UserControl1.ListBox1.Items.Count;
我在更新另一个用户控件中的用户控件时遇到问题。 示例代码: UserControl MyCart1 = (UserControl)Page.FindControl("MyCart1"); Update
我在下面添加了一些屏幕截图和重现步骤。 我的数据模型有一个基类,我们称它为 CommonThing,它有很多属性。然后有几个具有附加属性的此类的特殊版本。我现在想创建一个 UI 来将数据输入到这个模型
我有一个应用程序,我需要确保在使用 ShowDialog() 单击用户控件上的按钮打开的表单将在我处理用户控件时关闭和处理。 我通过计时器在主窗体中调用 userControl.Dispose()。
我正在努力实现... 用户控件(MyRepeater) Control Start Control End 页面 Page Start Page Item Tem
我是一名优秀的程序员,十分优秀!