Ставить цель команды в XAML

Зависит от наличия / отсутствия эволюции объекта - если вы хотите, чтобы особый случай, подклассификация или инъекция (DI) «выберите» поведение (стратегию) хорошо.

Но если вы также хотите, чтобы Field_List динамически изменял свое поведение, тогда свойство или метод мутации - единственный путь.

Пример: экран регистрации с различными «планами» - базовый, где вы можете выбрать только одну вещь и премиум, где вы можете выбрать столько, сколько хотите. Смена плана будет переключаться между выпадающим и несколькими флажками, при этом все еще имея тот же объект, включая его содержимое.

Я бы проголосовал за свойство / мутировать метод.

6
задан Kevin DiTraglia 3 October 2012 в 18:52
поделиться

2 ответа

Если вы хотите использовать 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));
    }
}

Обратите внимание, что я изменил некоторые имена / пространства имен классов в моем тестовом проекте. Вам придется изменить их в соответствии со своими потребностями.

8
ответ дан 10 December 2019 в 02:52
поделиться

Думали ли вы, что лучше использовать RelayCommand или DelegateCommand! Возможно, они больше подходят для того, что вам нужно?

Для примера использования RelayCommand прочтите эту статью Джоша

Брайан Нойес также имеет отличную статью здесь

1
ответ дан 10 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: