- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:在这里找到适合我的解决方案: http://social.msdn.microsoft.com/Forums/en/wpf/thread/c1fd21b2-424b-4536-be8c-335cee94596a
如下:
private void TextBoxLoaded(object sender, RoutedEventArgs e)
{
Binding bd = new Binding(TextBoxText.ToString());
bd.ValidationRules.Add(new DataErrorValidationRule());
bd.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
TextBox tb = sender as TextBox;
tb.SetBinding(TextBox.TextProperty, bd);
}
和
<UserControl x:Class="WpfApplication1.UserControl1"
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:wa="clr-namespace:WpfApplication1"
mc:Ignorable="d">
<DockPanel
VerticalAlignment="Center">
<Label
VerticalAlignment="Center"
Content="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type wa:UserControl1}},Path=LabelContent}"/>
<TextBox
VerticalAlignment="Center"
MinWidth="96"
Loaded="TextBoxLoaded">
</TextBox>
</DockPanel>
和
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wa="clr-namespace:WpfApplication1"
Title="MainWindow">
<Window.Resources>
<DataTemplate x:Key="personDisplay">
<DockPanel>
<wa:UserControl1 LabelContent="First name:" TextBoxText="fname"/>
<wa:UserControl1 LabelContent="Last name:" TextBoxText="lname"/>
<wa:UserControl1 LabelContent="Age:" TextBoxText="age"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<ContentControl
VerticalAlignment="Center"
Name="personCcl"
ContentTemplate="{StaticResource personDisplay}"/>
结束
我有一个需要包含标签和文本框的用户控件,文本框上的条目需要有一个验证规则来检查输入的值是否有效。我有一个数据模板,它使用用户控件显示一个具有多个字段的类。该类实现 IDataErrorInfo。但是,我遇到的问题是文本框没有访问 IDataErrorInfo 类,此外,无效控件周围的红色轮廓围绕着整个用户控件,而不仅仅是用户控件内的文本框。
我已经创建了一个更简单的示例来说明我在下面尝试做的事情。
这是类
public class Person : IDataErrorInfo
{
public string fname { get; set; }
public string lname { get; set; }
public int age { get; set; }
public Person(string f, string l, int a)
{
fname = f;
lname = l;
age = a;
}
public string Error
{
get
{
if (age < 18) return "Too young";
else if (fname == null || fname.Length == 0) return "Needs first name";
else if (lname == null || lname.Length == 0) return "Needs last name";
return null;
}
}
public string this[string name]
{
get
{
if (name == "age") { return age < 18 ? "Too young" : null; }
else if (name == "fname") { return fname == null || fname.Length == 0 ? "Needs first name" : null ; }
else if (name == "lname") { return lname == null || lname.Length == 0 ? "Needs last name" : null; }
return null;
}
}
}
这是用户控件:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
static readonly public DependencyProperty LabelContentProperty = DependencyProperty.Register(
"LabelContent",
typeof(string),
typeof(UserControl1),
new FrameworkPropertyMetadata("")
);
public string LabelContent
{
get { return GetValue(LabelContentProperty) as string; }
set { SetValue(LabelContentProperty, value); }
}
static readonly public DependencyProperty TextBoxTextProperty = DependencyProperty.Register(
"TextBoxText",
typeof(object),
typeof(UserControl1),
new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnTextBoxTextChanged), new CoerceValueCallback(CoerceTextBoxText))
);
public object TextBoxText
{
get { return GetValue(TextBoxTextProperty); }
set { SetValue(TextBoxTextProperty, value); }
}
static private void OnTextBoxTextChanged(DependencyObject dob, DependencyPropertyChangedEventArgs ea)
{
var uc = dob as UserControl1;
uc.OnTextBoxTextChanged(new RoutedPropertyChangedEventArgs<object>(ea.OldValue, ea.NewValue, TextBoxTextChangedEvent));
}
static private object CoerceTextBoxText(DependencyObject dob, object o)
{
return o;
}
static readonly public RoutedEvent TextBoxTextChangedEvent = EventManager.RegisterRoutedEvent(
"TextBoxTextChanged",
RoutingStrategy.Bubble,
typeof(RoutedPropertyChangedEventArgs<object>),
typeof(UserControl1));
public event RoutedPropertyChangedEventHandler<object> TextBoxTextChanged
{
add { AddHandler(TextBoxTextChangedEvent, value); }
remove { RemoveHandler(TextBoxTextChangedEvent, value); }
}
protected virtual void OnTextBoxTextChanged(RoutedPropertyChangedEventArgs<object> ea) { RaiseEvent(ea); }
}
这是用户控件 xaml:
<UserControl x:Class="WpfApplication1.UserControl1"
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:wa="clr-namespace:WpfApplication1"
mc:Ignorable="d">
<DockPanel>
<Label
VerticalAlignment="Center"
Content="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type wa:UserControl1}},
Path=LabelContent}"/>
<TextBox
VerticalAlignment="Center"
MinWidth="96">
<TextBox.Text>
<Binding
RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type wa:UserControl1}}"
Path="TextBoxText"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</DockPanel>
这是窗口 xaml(已更新):
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wa="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="personDisplay">
<DockPanel>
<wa:UserControl1 LabelContent="First name:" TextBoxText="{Binding fname,Mode=TwoWay}"/>
<wa:UserControl1 LabelContent="Last name:" TextBoxText="{Binding lname,Mode=TwoWay}"/>
<wa:UserControl1 LabelContent="Age:" TextBoxText="{Binding age,Mode=TwoWay}"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<ContentControl
VerticalAlignment="Center"
Name="personCcl"
ContentTemplate="{StaticResource personDisplay}"/>
</Window>
这是窗口构造函数
public MainWindow()
{
InitializeComponent();
personCcl.Content = new Person("John", "Smith", 33);
}
最佳答案
这是错误的。不要让 personCc1.Content = new Person。使它成为 personCc1.DataContext = new Person。内容期望您只显示该类的值并且主要用于 UI。
关于wpf - UserControl 内部控件的 ValidationRules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129600/
您好,我的 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
我是一名优秀的程序员,十分优秀!