我创建了一个使用IValueConverter接口和InConverter的转换器类。它绑定到DataGrid,并传递一个字符串数组,在其中确定值是否在数组中。
[ValueConversion(typeof(int), typeof(bool))]
public class InConverter : IValueConverter
{
public object Convert(object value, Type type, object parameter, CultureInfo info)
{
String str = value as String;
String[] compareList = parameter as String[];
if (str != null)
{
foreach (String compare in compareList)
{
if (str == compare)
return true;
}
}
return false;
}
public object ConvertBack(object value, Type type, object parameter, CultureInfo info)
{
throw new NotImplementedException();
}
}
我还有一个名为NotItConverter的对流类,它本质上返回InConverter的反面,我不想有冗余代码。所以,我想到了这样做。
[ValueConversion(typeof(int), typeof(bool))]
public class NotInConverter : InConverter
{
public object Convert(object value, Type type, object parameter, CultureInfo info)
{
return !(Boolean)base.Convert(value, type, parameter, info);
}
public object ConvertBack(object value, Type type, object parameter, CultureInfo info)
{
throw new NotImplementedException();
}
}
但这不起作用。在没有警告的情况下使其成为complile的唯一方法是使NotInConverter中的方法指定override,InConverter中的方法指定virtual。有没有更简单的方法来实现这一目标?
答案 0 :(得分:3)
您需要在派生类中重新指定接口:
public class NotInConverter : InConverter, IValueConverter
这将使编译器为派生类
创建单独的接口映射证明:
static void Main()
{
ITest x = new TestDerived();
x.Name();
}
interface ITest {
void Name();
}
class TestBase : ITest {
public void Name() { Console.WriteLine("Base"); }
}
class TestDerived : TestBase, ITest {
public void Name() { Console.WriteLine("Derived"); }
}
这会打印Derived
。
答案 1 :(得分:1)
我认为这是两个建议的组合:
public class NotInConverter : InConverter, IValueConverter
{
new public object Convert(...)
{
return !base.Convert(...);
}
new public object ConvertBack(...)
{
return !base.ConvertBack(...);
}
}