Зависит от наличия / отсутствия эволюции объекта - если вы хотите, чтобы особый случай, подклассификация или инъекция (DI) «выберите» поведение (стратегию) хорошо.
Но если вы также хотите, чтобы Field_List динамически изменял свое поведение, тогда свойство или метод мутации - единственный путь.
Пример: экран регистрации с различными «планами» - базовый, где вы можете выбрать только одну вещь и премиум, где вы можете выбрать столько, сколько хотите. Смена плана будет переключаться между выпадающим и несколькими флажками, при этом все еще имея тот же объект, включая его содержимое.
Я бы проголосовал за свойство / мутировать метод.
Если вы хотите использовать CommandTargets, я бы создал CommandTarget DependencyProperty в вашем пользовательском элементе управления UserControl, аналогично тому, как он определен в ButtonBase.
После этого установите CommandTarget вашего Button на свой Custom UserControl's CommandTarget.
РЕДАКТИРОВАТЬ: Пример кода
Комментарии Руди действительны, если вы используете архитектуру MVVM - RelayCommands или другая форма обернутых делегатов хорошо работают в этом случае. Судя по вашему образцу кода, не похоже, что вы использовали этот подход, отсюда и мой первоначальный комментарий.
Что касается кода, вам нужно только изменить свой класс ToolBar. Предполагается, что ваш класс MyCommand унаследован от RoutedUICommand. Вот XAML:
<UserControl
x:Class="WPFCommandTarget.CustomToolBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFCommandTarget"
x:Name="theControl">
<Grid>
<Button
x:Name="theButton"
Command="{x:Static local:Commands.MyCommand}"
CommandTarget="{Binding ElementName=theControl, Path=CommandTarget, Mode=OneWay}"
Content="Try Me" />
</Grid>
</UserControl>
А вот код программной части:
using System.Windows; using System.Windows.Controls;
namespace WPFCommandTarget
{
/// <summary>
/// Interaction logic for CustomToolBar.xaml
/// </summary>
public partial class CustomToolBar : UserControl
{
public CustomToolBar()
{
InitializeComponent();
}
public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}
// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(CustomToolBar), new UIPropertyMetadata(null));
}
}
Обратите внимание, что я изменил некоторые имена / пространства имен классов в моем тестовом проекте. Вам придется изменить их в соответствии со своими потребностями.
Думали ли вы, что лучше использовать RelayCommand или DelegateCommand! Возможно, они больше подходят для того, что вам нужно?
Для примера использования RelayCommand прочтите эту статью Джоша
Брайан Нойес также имеет отличную статью здесь