句柄可以执行动态按钮c#中的条件



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

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

实际上,这不是绑定问题或WPF问题。这是一个设计模式问题。

解决方案

定义一个ListDictionary来存储所有选项卡的对象,然后可以使用索引而不是重复的开关情况来获取每个对象。

例如,可以使用TabIndex键和关联的对象定义Dictionary

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包

最新更新