【问题标题】:Add a parameter to a WPF custom control based on ITypeEditor?给基于ITypeEditor的WPF自定义控件添加参数?
【发布时间】:2020-07-19 11:28:20
【问题描述】:

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

对我来说,最优雅的解决方案似乎能够将枚举传递给它(用于“模式”),但如果我可以获得编辑器附加到的属性(即以下示例中的 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; } = "";

【问题讨论】:

    标签: c# wpf propertygrid xceed


    【解决方案1】:

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

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

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

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

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

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

    您还可以参考 SOLID 原则并使用单一职责模式,这意味着一个类应该只有一个职责。您可能会争辩说,根据参数 det 解析类型编辑器,否则不会影响类,这违反了这一原则。

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

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

    这对你有意义吗?

    【讨论】:

    • 恐怕我对 IoC 的了解还不够,无法在没有一些细节的情况下实现它。作为一个相当简单的解决方案,我可以获得对应用编辑器的属性的引用吗?
    • 我已经更新了我的答案,不需要遵循具体细节,但我试图提供更多关于如何完成的提示。但是实际上没有为您编写代码,我不知道如何更好地解释这一点::)
    • 如果我可以访问 PropertyGridFilePicker 的构造函数并将其传递给它一个参数,那么我认为这将解决我的问题。但我不知道该怎么做。我没有显式地实例化 PropertyGridFilePicker 的实例——我只是用它来装饰一个属性。 (这与有人问here 的问题几乎相同,但给出的答案提出了不同的解决方案,所以我一点也不聪明)。
    • 有人说 here 在一个非常相似的问题上,即 “由于您没有创建自己的 UITypeEditor 派生实例,因此您无法控制传递给构造函数”.
    【解决方案2】:

    这里给出答案:

    Possible to call the constructor of a WPF type editor (inheriting from ITypeEditor)?

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

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2011-03-12
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多