c# - 我可以设置依赖于其他属性的 IntelliSense 建议吗?
问题描述
好的,这可能是一个幼稚的问题,但我想获得有关多个枚举属性的 IntelliSense 建议。出色地。有点。但让我解释一下。
我有几个像这样的枚举
public static class Icons
{
public enum Regular { /* ... */ }
public enum Solid{ /* ... */ }
public enum Brands { /* ... */ }
}
public enum Styles { /* ... */ }
现在我得到了一个带有两个 DependencyProperties 的 XAML 控件
public static readonly DependencyProperty MyStyleProperty = DependencyProperty.Register(nameof(MyStyle), typeof(Styles), typeof(Icon), new FrameworkPropertyMetadata(Styles.None, FrameworkPropertyMetadataOptions.AffectsRender, OnUpdateControl));
public static readonly DependencyProperty MyIconProperty = DependencyProperty.Register(nameof(MyIcon), typeof(object), typeof(Icon), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, OnUpdateControl));
Control.Style
接受来自 enum 的值Styles
。
Control.Icon
接受值Icons.[Regular, Solid, Brands]
。
IntelliSense 建议Icon
取决于所选的Style
. 所以 if Control.Style
is Styles.Regular
then 只显示关于Icons.Regular
on 的建议Control.Icon
。
解决方案
从理论上讲,添加一个CompletionProvider
允许 Intellisense 处理您的单个类的方法是可能的,但对于这样一个常见问题来说,这将是多余的。相反,使用枚举类或使用类别类。
枚举类(不完全是,因为构造函数是公共的,但在这种情况下,将其打开似乎是合乎逻辑的):
public sealed class IconImage
{
public Uri ImageUri { get; }
public IconImage(Uri imageUri)
{
this.ImageUri = imageUri;
}
public static class ApplicationActions
{
public readonly IconImage Save = new IconImage(new Uri("foo"));
public readonly IconImage Open = new IconImage(new Uri("foo"));
public readonly IconImage Print = new IconImage(new Uri("foo"));
}
public static class Marks
{
public readonly IconImage Check = new IconImage(new Uri("foo"));
public readonly IconImage Tickbox = new IconImage(new Uri("foo"));
public readonly IconImage CheckedTickbox = new IconImage(new Uri("foo"));
}
// ...
}
// Usage: control.Icon = IconImage.Marks.TickBox;
// XAML (without TypeConverter): Icon="{x:Static local:IconImage.Marks.TickBox}"
// XAML (with TypeConverter): Icon="Marks.TickBox"
类别类:
public enum IconImage
{
Save, Open, Print,
Check, Tickbox, CheckedTickbox,
// ...
}
public static class IconImages
{
public static class Application
{
public static readonly IconImage
Save = IconImage.Save,
Open = IconImage.Open,
Print = IconImage.Print;
}
public static class Marks
{
public static readonly IconImage
Check = IconImage.Check,
Tickbox = IconImage.Tickbox,
CheckedTickbox = IconImage.CheckedTickbox;
}
// … other category classes …
}
// Usage: control.Icon = IconImage.Print -- or -- control.Icon = IconImages.Application.Print
// XAML: Icon="Print" -- or -- Icon="{x:Static local:IconImages.Application.Print}"
无论哪种方式,我都建议使用 T4 或 XSLT 之类的工具来动态生成代码。尝试手动维护大型列表时很容易引入错误。
推荐阅读
- haskell - 如何制作偏函数?
- python - 为什么在交换之前查找索引而不是内联会改变结果?
- jquery - 我无法正确获得价值
- review-board - 将 reviewboard 2.x 升级到 3.x
- javascript - 如何将 Discord.js 和 twit 相互集成以在指定频道上进行实时 Twitter 提要
- python - 在 WHERE 子句中使用占位符查询记录是否存在
- node.js - Node.js Streams readable.readableLength 不返回文件大小
- javascript - 进口国家列表为空
- node.js - 当 Jenkins 管道为 React 应用程序运行 docker 时,Nginx 502 Bad Gateway
- javascript - 无法从数组中设置引导选择的多个值