我的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;
}
}
答案 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软件包