0

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

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

 ...

原因?

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

所以我只需要将这个 Content 属性传播到 myCustomRichEditWithIconBars。

你能帮我解决这个问题吗?

非常感谢。

汤姆

4

1 回答 1

0

我建议不要这样做。

这个想法会有一些缺点:

  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.
    }
}
于 2013-10-14T19:06:02.870 回答