Нет необходимости создавать отдельную ViewModel для повторно используемого элемента управления, который имеет такое простое поведение. Просто добавив несколько DependencyProperties и обработчик событий в простой UserControl, вы можете повторно использовать логику и устанавливать только те свойства, которые на самом деле различны для каждого экземпляра. Для XAML UserControl вам просто нужно подключить TextBox к DependencyProperty и обработчику Button to Click.
<DockPanel>
<Button Content="Reset" Click="Button_Click"/>
<TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}"/>
</DockPanel>
Код для UserControl просто должен определить свойства, которые могут быть привязаны извне, и обработчик для сброса текста.
public partial class ResetTextBox : UserControl
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(ResetTextBox),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty ResetTextProperty = DependencyProperty.Register(
"ResetText",
typeof(string),
typeof(ResetTextBox),
new UIPropertyMetadata(String.Empty));
public string ResetText
{
get { return (string)GetValue(ResetTextProperty); }
set { SetValue(ResetTextProperty, value); }
}
public ResetTextBox()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Text = ResetText;
}
}
Затем, чтобы использовать элемент управления, вам просто нужно привязать свои свойства строки ViewModel и установить текст по умолчанию, который должен применяться при сбросе, который может быть здесь либо жестко задан, либо привязан к другим свойствам ВМ.
<StackPanel>
<local:ResetTextBox ResetText="One" Text="{Binding Name1}"/>
<local:ResetTextBox ResetText="Two" Text="{Binding Name2}"/>
<local:ResetTextBox ResetText="Three" Text="{Binding Name3}"/>
</StackPanel>