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

C# 基于ITypeEditor向WPF自定义控件添加参数?,c#,wpf,propertygrid,xceed,C#,Wpf,Propertygrid,Xceed,C#,WPF,xceed PropertyGrid。我正在使用自定义控件在PropertyGrid中提供浏览按钮。用例中有各种变化(例如,最明显的是浏览文件夹和文件),为这些情况创建单独的编辑器不会很枯燥。理想情况下,我希望引入一个参数,但我不确定如何将其传递给控件。有没有一个合理简单的方法来实现这一点 对我来说,最优雅的解决方案似乎能够向它传递一个枚举(对于“mode”),但如果我能够获得编辑器所附加的属性(例如,在下面的示例中为ProjectFolder),那么这也可以达到目的 public

C#
WPF
xceed 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; } = "";

我认为最优雅的方式是国际奥委会。依赖项注入取代了普通实例

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

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

IOC是控制反转,我个人认为这是固体原理最后一步的一部分。依赖倒置

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

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

您还可以从SOLID principles中翻出一页,使用单一责任模式,这意味着一个类应该只有一个责任。您可能会争辩说,基于参数det解析类型编辑器(否则不会影响类)违反了这一原则

我将使它完全依赖于接口,并将所需的输入从控制器传递到包含编辑器解析逻辑的具体实现,甚至可能是值属性和源属性的解析逻辑

这将允许您将2个contrete实例传递到单个contrete中,然后将其传递给PropertyGridFilePicker类,并从contrete实例、您的“IResolveEditor”或任何您想要调用接口的实例创建其绑定等,并配置类型为“PropertyGridFilePicker”的特定contrete模型,在这种情况下


这对你有意义吗?

我认为最优雅的方式是国际奥委会。依赖项注入取代了普通实例

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

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

IOC是控制反转,我个人认为这是固体原理最后一步的一部分。依赖倒置

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

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

您还可以从SOLID principles中翻出一页,使用单一责任模式,这意味着一个类应该只有一个责任。您可能会争辩说,基于参数det解析类型编辑器(否则不会影响类)违反了这一原则

我将使它完全依赖于接口,并将所需的输入从控制器传递到包含编辑器解析逻辑的具体实现,甚至可能是值属性和源属性的解析逻辑

这将允许您将2个contrete实例传递到单个contrete中,然后将其传递给PropertyGridFilePicker类,并从contrete实例、您的“IResolveEditor”或任何您想要调用接口的实例创建其绑定等,并配置类型为“PropertyGridFilePicker”的特定contrete模型,在这种情况下

这对你有意义吗?

回答如下:

虽然作为不同的问题发布,但这与相同的问题有关。我要求澄清在这里给出的另一个答案中提出的依赖注入解决方案,因为我不明白这是如何工作的。看起来不会。这里给出的答案是:


虽然作为不同的问题发布,但这与相同的问题有关。我要求澄清在这里给出的另一个答案中提出的依赖注入解决方案,因为我不明白这是如何工作的。而且似乎不会。

恐怕我对国际奥委会的了解不够,无法在没有具体细节的情况下实施。作为一个相当简单的解决方案,我可以得到一个编辑器应用到的属性的引用吗?我已经更新了我的答案,不需要遵循细节,但我试图给出一个更多的提示,说明如何可以做到这一点。但是除了为您实际编写代码之外,我不知道如何更好地解释这一点:)如果我可以访问PropertyGridFilePicker的构造函数并向其传递一个参数,那么我认为这将解决我的问题。但我不知道怎么做。我没有显式地实例化Prop的实例