基于 ITypeEditor 向 WPF 自定义控件添加参数?

Add a parameter to a WPF custom control based on ITypeEditor?

C#WPFxceed PropertyGrid。我正在使用自定义控件在 PropertyGrid 中提供浏览按钮。用例存在差异(例如,最明显的是浏览文件夹与文件),并且为这些情况创建单独的编辑器不会很枯燥。理想情况下,我想引入一个参数,但我不确定如何将其传递给控件。有没有一种相当简单的方法来实现这一目标?

对我来说,最优雅的解决方案似乎能够向它传递一个枚举(对于 'mode'),但如果我能得到编辑器附加的 属性(即 ProjectFolder 在下面的例子中)那么这也可以达到目的。

public partial class PropertyGridFilePicker : ITypeEditor
{
    string rtn = "";
    public PropertyGridFilePicker()
    {
        InitializeComponent();
    }

    public string Value
    {
        get { return (string)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(string), typeof(PropertyGridFilePicker), new PropertyMetadata(null));

    public FrameworkElement ResolveEditor(PropertyItem propertyItem)
    {
        Binding binding = new Binding("Value");
        binding.Source = propertyItem;
        binding.Mode = propertyItem.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay;
        BindingOperations.SetBinding(this, ValueProperty, binding);
        return this;
    }

    private void PickFileButton_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog fd = new OpenFileDialog();
        if (fd.ShowDialog() == true && fd.CheckFileExists)
        {
            Value = fd.FileName;
            Value = rtn;
        }
    }
}

它是这样使用的:

[Editor(typeof(MyControls.PropertyGridFilePicker), typeof(MyControls.PropertyGridFilePicker))]
public string ProjectFolder { get; set; } = "";

我想说最优雅的方式是通过 IoC。依赖注入取代了正常的实例化。

因为如果您稍后希望引入另一种类型的文件夹处理或编辑器,您只需注入一个新的具体而不是设计一个 FrameworkElement 的实例。您所要做的就是扩展 FrameworkElement 的现有功能。

我不会为您编写代码,但我会更好地解释自己。

IoC 是控制反转,我个人认为它是 SOLID 原则最后一步的一部分。依赖倒置。

你必须传递一个抽象。我建议使用接口而不是抽象,老实说,我不认为抽象真的遵循依赖注入模式的精神。但是,嗯,我不明白为什么不。

这个概念是,例如,解析编辑器应该在一个实例中完成,该实例是在您的 FrameWorkElement class 之外创建的,然后传递到您的 PropertyGridFilePicker 的构造函数中。

您也可以借鉴 SOLID 原则并使用单一责任模式,这意味着 class 应该只承担 1 项责任。你可能会争辩说,根据参数 det 解析类型编辑器,否则不会影响 class,这违反了这一原则。

我会让它全部依赖于接口,并将可能来自控制器的所需输入传递给包含编辑器解析逻辑的具体实现,甚至可能是您的值 属性 和源代码的解析逻辑属性.

这将允许您将 2 个 contrete 实例传递到一个 contrete,然后将其传递给 PropertyGridFilePicker class,它会从您的“IResolveEditor”或其他任何内容的 contrete 实例创建它的绑定等您想调用该接口,并在本例中配置“PropertyGridFilePicker”类型的特定具体模型。

你觉得这有意义吗?

此处给出的答案:

尽管作为不同的问题发布,但这与同一问题相关。我要求澄清此处给出的其他答案中提出的依赖注入解决方案,因为我不明白这是如何工作的。而且好像不会。