silverlight(或WPF)dependecyProperty没有支持字段 - 仅包装

时间:2013-10-14 18:38:00

标签: c# wpf silverlight xaml

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

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

 ...

原因?

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

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

请帮帮我吗?

非常感谢你。

汤姆

1 个答案:

答案 0 :(得分:0)

我建议反对。

这个想法会有一些缺点:

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

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

  3. 您在转换器中处理读写异常时遇到困难,而且只有其他可以捕获它的地方才会是您的通用未处理异常处理程序。不好玩。

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

  5. 我会考虑让代码隐藏公开富文本字段,或者公开一个更新富文本字段的属性。你可以用这种方式控制它。并且您可以在需要时控制文件操作,而不是在转换器介入时控制文件操作。

    如果你必须......

    首先你绑定错了。您没有从控件的外部绑定,因为您仍然有两个副本。一个副本将是您的控件的内容,另一个副本将是富文本控件的副本。您绑定控件上的属性和富文本控件上的内容属性。你在那里使用转换器。

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

    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.
        }
    }