不带支持字段的 silverlight(或 WPF)依赖项属性 - 仅限包装器

本文关键字:属性 依赖 包装 WPF 字段 支持 silverlight | 更新日期: 2023-09-27 18:35:14

我有自定义控件(或模板化控件),它封装了丰富的编辑控件和许多图标栏。该控件具有 Content 属性。我需要使用我的新控件直接从 xaml 操作此内容属性:

<myCustomRichEditWithIconBars Content="{Binding file,
                                        Converter={StaticResource ...}}" />
 ...

原因?

此丰富的编辑控件内容可能是非常大的文件。我不想让它存储两次。

所以我只需要将此内容属性传播到 myCustomRichEditWithIconBars。

你能帮我这个吗?

谢谢。

汤姆

不带支持字段的 silverlight(或 WPF)依赖项属性 - 仅限包装器

我建议不要这样做。

这个想法会有一些缺点:

  1. 您将被限制为单向绑定,或被迫保存每当绑定更新时。

  2. 您的文件操作将在控件加载时激活,并且您将无法对文件交互进行外部控制。

  3. 您只能在转换器中处理读写异常,并且它们只有在可以捕获它的其他地方才是您的通用未经处理的异常处理程序。不好玩。

  4. 如果您有控件的多个副本,则有多个对象负责控制读写,并且将强制关闭该文件。

我会考虑让代码隐藏公开富文本字段,或公开更新富文本字段的属性。这样你就可以更好地控制它。而且,您可以在需要时控制文件操作,而不是在转换器干预时控制文件操作。

如果你必须...

首先,绑定错误。您不会从控件外部绑定,因为您仍然有两个副本。一个副本是控件的内容,另一个副本是格式文本控件的副本。在控件上的属性和格式文本控件上的内容属性之间进行绑定。在那里你使用转换器。

您需要更改它,以便自定义控件的内容实际上是一个字符串,即文件路径,转换器位于内部富文本和包装控件之间。

public class myCustomRichEditWithIconBars
{
    public override void OnApplyTemplate() 
    {
        // get part and store in _textField; 
        // bind rich text content field to filepath using converter.
        // this can be done in the xaml of your control too.
    }
    public String filePath {...}
    private RichText _textField {...}
}

转换器将打开文件路径并读取文件并返回文件的内容,当它转换回来时,它将从富文本的内容中保存文件。

public class myConverter : IValueConverter
{
    Convert(...)
    {
        var filePath = (String)value;
        // read file, return what goes into the rich text field.
    }
    ConvertBack(...)
    {
        var richText = // the data from the field.
        // save into file.
    }
}