WPF:如何重用XAML片段?

时间:2017-08-02 09:41:53

标签: wpf data-binding

我想重用一个带有替换字符串作为参数的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>

特别是,我希望能够自定义此模板的实例。

我很高兴阅读文档,但我不知道该搜索什么来寻找合适的文档,这些文档本质上不是一个非常复杂的查找和替换机制。

1 个答案:

答案 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>

如果您尝试创建自定义控件,则此postquestion值得关注。关键部分是向您的控件添加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" .../>