Вы можете сделать это с помощью Command и CommandParameter
Сначала свяжите кнопку с ICommand, например:
<Button Content="Go" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=myRichTextBox, Path=Selection}" />
<RichTextBox Name="myRichTextBox" />
Затем в вашей ViewModel, Controller или Code-behind или где-либо еще вы выставляете ICommand как свойство и указываете на метод для выполнения работы, например ...
public ICommand MyCommand
{
get
{
if (_queryCommand == null)
{
_queryCommand = new RelayCommand<TextSelection>(DoWork);
}
return _queryCommand;
}
}
private void DoWork(TextSelection param)
{
string selectedText = param.Text;
// Build your control here...
// probably put it in an ObservableCollection<Control> which is bound by an Items Control, like a ListBox
}
Примечание: я использовал RelayCommand от превосходного MVVM Foundation Джоша Смита , но вы могли бы также использовать RoutedUICommand, например (что добавило бы дополнительное преимущество, позволяющее вам связывать входные жесты с вашей командой)