小编gst*_*ken的帖子

如何比较泛型类型的值?

如何比较泛型类型的值?

我把它减少到最小的样本:

public class Foo<T> where T : IComparable
{
    private T _minimumValue = default(T);

    public bool IsInRange(T value) 
    {
        return (value >= _minimumValue); // <-- Error here
    }
}
Run Code Online (Sandbox Code Playgroud)

错误是:

运算符'> ='不能应用于'T'和'T'类型的操作数.

到底怎么回事!?T已被约束到IComparable,甚至它限制值类型(的时候where T: struct),我们仍然不能将任何运营商<,>,<=,>=,==!=.(我知道,涉及到解决方法Equals()的存在==!=,但它并不能帮助对于关系运算符).

那么,有两个问题:

  1. 为什么我们观察到这种奇怪的行为?是什么让我们从比较这是泛型类型的值称为IComparable?它不是以某种方式打败了通用约束的整个目的吗?
  2. 我该如何解决这个问题,或至少解决这个问题?

(我意识到已经有一些问题与这个看似简单的问题有关 - 但没有一个线程能给出详尽或可行的答案,所以在这里.)

.net c# generics icomparable

70
推荐指数
4
解决办法
6万
查看次数

TreeViewItem:如何在单击而不是MouseDown上进行选择更改?

背景:我正在从TreeView中实现“拖放”。要求是拖动某一项应该不会改变选择-只有完成后,单击(上的MouseUp同一项目),应选择该项目。

但是,TreeView的默认行为是在MouseDown上引发SelectedItemChanged事件。关于如何改变的任何想法?

谢谢!

编辑:我忘了提到一个重要的观点-我很抱歉。我将Gong拖放框架用于所有拖放操作,因为它与MVVM很好地融合了(我的视图中不需要任何代码隐藏)。拖放逻辑是通过Views的XAML中的附加属性完全在ViewModels中处理的。

因此,PreviewMouseDown本人涉及并处理所有选择和拖动逻辑的解决方案将适得其反。因此,我只是在寻找一种(简单的)方法来防止TreeView控件在鼠标按下时更改选择,同时仍然引发诸如等的常见冒泡事件MouseDownMouseMove以使拖放库按设计工作。

我的下一个想法是自己修改Gong拖放库代码-我只是希望可以避免这种情况,并且有人会想出一种简单的方法来更改TreeView在这方面的行为。

wpf treeview drag-and-drop selection

5
推荐指数
1
解决办法
1177
查看次数

标签 统计

.net ×1

c# ×1

drag-and-drop ×1

generics ×1

icomparable ×1

selection ×1

treeview ×1

wpf ×1