2017-08-02 46 views
0

我想重複使用替代字符串作爲參數的XAML片段。WPF:如何重用XAML片段?

有點像#define與一些函數樣式參數。

我可以這樣做嗎?

如果是這樣,那麼最好的方法是什麼?

所以,這裏是什麼,我想要做的

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

... ,然後在其他地方XAML,而不是使用文本框無效XAML,我會做

<ValidatedTextBox SomeAttributeName="MyPropertyToBeBound" AttributeNotOnTemplate="Value"> 
    <ElementNotOnTemplate /> 
</ValidatedTextBox> 

在特別是,我希望能夠自定義此模板的實例。

我很高興閱讀文檔,但我不知道要尋找哪些適合的文檔,這些文檔本質上不是一個查找和替換機制。

回答

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> 

或者,你可以這樣定義

風格3210

如果你正在嘗試創建一個自定義控件,這個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" .../>