Ручка может выполнять условия в динамической кнопке c # - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть кнопка как аксессуар в моем TabControl, где находится 2 TabItem.Эта кнопка копирует другой объект, используемый на вкладках.Я хочу иметь возможность реализовать функции, отличные от этой кнопки копирования, для каждой вкладки в одной команде, поэтому я реализовал общую команду копирования в главном представлении, которая проверяет текущий индекс вкладки, чтобы увидеть, что мы в данный момент на какой вкладке, ноТеперь, как лучше всего обработать мои невыполненные условия, не повторяя мой случай переключения в методе Условия?Например, кнопка первой вкладки не может быть выполнена, если ее объект равен нулю, кнопка вкладки не может быть выполнена, если ее объект равен нулю и т. Д.

public RelayCommandWithCannotExecuteReason Copy
    {
        get
        {
            if (_copy == null)
            {
                _copy = new RelayCommandWithCannotExecuteReason(
                    x =>
                    {

                        switch (SelectedTabIndex) {
                            case 1:
                                Clipboard.SetData("First", object1);
                                break;
                            case 2:

                                Clipboard.SetData("Second", object2;
                                break;
                        }

                    }, CanCopyConditions);
            }

            return _copy;
        }
    }

1 Ответ

0 голосов
/ 01 декабря 2018

На самом деле, это не проблема Binding или WPF.Это вопрос шаблона проектирования.

Решение

Определите List или Dictionary для хранения ваших объектов на всех вкладках, а затем вы можете выбрать каждый объект, используя индекс вместоДублированный регистр переключателя.

Например, вы можете определить Dictionary с помощью клавиши TabIndex и связанного объекта.

private Dictionary<int, (string name, object value)> _tabObjectDictionary = new Dictionary<int, (string, object)>
{
    { 1, ("First", object1) },
    { 2, ("Second", object2) },
    { 3, ("Third", object3) },
};

Или вы можете просто вывести индекс с помощьюsingle List index.

private List<(string name, object value)> _tabObjectList = new List<(string, object)>
{
    ("First", object1),
    ("Second", object2),
    ("Third", object3),
};

Затем вы можете получить объект с помощью индекса.

public RelayCommandWithCannotExecuteReason Copy
{
    get
    {
        if (_copy == null)
        {
            _copy = new RelayCommandWithCannotExecuteReason(
                x =>
                {
                    var (name, value) = _tabObjectDictionary[SelectedTabIndex];
                    Clipboard.SetData(name, value);

                }, x =>
                {
                    var (name, value) = _tabObjectDictionary[SelectedTabIndex];
                    // Verify your conditions here.
                    return value != null;
                });
        }

        return _copy;
    }
}

Советы: вам может потребоваться установить пакет NuGet с именем System.ValueTuple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...