句柄可以在动态按钮c#

时间:2018-11-30 21:54:51

标签: c# wpf xaml

我的TabControl中有一个Button作为附件,其中有2个TabItem。此按钮复制选项卡中使用的不同对象。我希望能够在一个命令中为每个选项卡实现与“复制按钮”不同的功能,因此我在主视图中实现了常规的“复制命令”,该命令可检查当前选项卡索引以查看我们当前位于哪个选项卡中,但是现在,如果不在Conditions方法中重复执行切换条件,我无法处理条件的最佳处理方式是什么?例如,如果第一个选项卡按钮的对象为null,则无法执行;如果其对象为null,则无法执行。等。

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 :(得分:0)

实际上,这不是绑定问题或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) },
};

或者您可以仅使用单个List索引来推断索引。

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;
    }
}

提示:您可能必须安装名为System.ValueTuple的NuGet软件包