我想重用一个带有替换字符串作为参数的XAML片段。
有点像带有一些函数样式参数的#define。
我可以这样做吗?
如果是这样,最好的办法是如何进行呢?
所以,这是我想要做的无效XAML
<input type="file" name="profimages" id="profimages">
... 然后在XAML的其他地方,而不是使用TextBox,我会做
<Template Base="TextBox" key="ValidatedTextBox">
<TextBox.Text>
<Binding NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged" Path="{SomeAttributeName}">
<Binding.ValidationRules>
<local:SomeRule></local:SomeRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</Template>
特别是,我希望能够自定义此模板的实例。
我很高兴阅读文档,但我不知道该搜索什么来寻找合适的文档,这些文档本质上不是一个非常复杂的查找和替换机制。
答案 0 :(得分:0)
我不确定您是否只是尝试向TextBox
添加验证或创建自定义控件。如果您正在努力验证,post给出了非常好的概述。总之,你可以做这样的事情
public class ViewModel : System.ComponentModel.IDataErrorInfo
{
public ViewModel()
{
/* Set default age */
this.Age = 30;
}
public int Age { get; set; }
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get
{
switch (columnName)
{
case "Age":
if (this.Age < 10 || this.Age > 100)
return "The age must be between 10 and 100";
break;
}
return string.Empty;
}
}
}
然后像这样使用它
<TextBox Text="{Binding Path=Age, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
如果您想创建自己的错误模板,可以为此类TextBox
个人创建
<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}">
<Validation.ErrorTemplate>
<ControlTemplate>
<StackPanel>
<!-- Placeholder for the TextBox itself -->
<AdornedElementPlaceholder x:Name="textBox"/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
或者,您可以定义这样的样式
<Style TargetType="x:TextBox">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<AdornedElementPlaceholder/>
<TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果您尝试创建自定义控件,则此post和question值得关注。关键部分是向您的控件添加DependencyProperty
,如此
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(MyTextBox), new PropertyMetadata(string.Empty, OnTextChangedCallback));
private static void OnTextChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Validation in here
}
然后你可以像这样使用它
<MyTextBox Text="My Text" .../>