【问题标题】:Custom WPF control with Unity failing to resolveUnity 无法解决的自定义 WPF 控件
【发布时间】:2010-09-02 21:45:37
【问题描述】:
public class RichTextBoxExtended : RichTextBox
{
    static RichTextBoxExtended()
    {
        //DefaultStyleKeyProperty.OverrideMetadata(typeof(RichTextBoxExtended), new FrameworkPropertyMetadata(typeof(RichTextBoxExtended)));
    }

    public byte[] Text
    {
        get { return (byte[])GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(byte[]), typeof(RichTextBoxExtended), new UIPropertyMetadata(null, new PropertyChangedCallback(TextChangedCallback)));

    private static void TextChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        RichTextBoxExtended richTextBoxExtended = obj as RichTextBoxExtended;
        richTextBoxExtended.ChangeText(e);
    }

    private void ChangeText(DependencyPropertyChangedEventArgs e)
    {
        //clear out any formatting properties
        TextRange range = new TextRange(base.Document.ContentStart, base.Document.ContentEnd);
        range.ClearAllProperties();

        //load bytes into stream, load stream into range
        MemoryStream stream = new MemoryStream(e.NewValue as byte[]);
        range.Load(stream, DataFormats.Rtf);
    }
}

上面是自定义控件...

XAML 实现自定义控件...

<Grid>
    <controls:RichTextBoxExtended x:Name="Document" Text="{Binding Path=File}">
    </controls:RichTextBoxExtended>
</Grid>

关联的虚拟机...

public class FileViewerViewModel : AViewModel
{
    private byte[] _file = null;

    public FileViewerViewModel(ILoggerFacade logger)
    {

    }

    /// <summary>
    /// Gets or sets the <seealso cref="DataFormats.Rtf"/> file representation as a <seealso cref="byte[]"/>
    /// </summary>
    public byte[] File
    {
        get 
        {
            return _file;
        }
        set 
        {
            _file = value;
            RaiseChanged(() => this.File);
        }
    }
}

最后......如果我打电话......

FileViewerView view = _container.Resolve<FileViewerView>();

失败了。

Resolution of the dependency failed, type = "cyos.infrastructure.Views.FileViewerView", name = "". Exception message is: The current build operation (build key Build Key[cyos.infrastructure.Views.FileViewerView, null]) failed: Object reference not set to an instance of an object. (Strategy type BuildPlanStrategy, index 3)

如果我从 XAML 中删除绑定...

<Grid> 
    <controls:RichTextBoxExtended x:Name="Document">
    </controls:RichTextBoxExtended>
</Grid>

一切顺利...完全没有问题...想法?

编辑:

切换到创建一个新实例,绕过 Unity。问题仍然在同一个地方,在 InitializeComponent() 处构造 FileViewerView 时出现异常,“对象引用未设置为对象的实例。”

在 System.Windows.Markup.BamlRecordReader.ProvideValueFromMarkupExtension(MarkupExtension markupExtension, Object obj, Object member) 在 System.Windows.Markup.BamlRecordReader.ReadPropertyArrayEndRecord() 在 System.Windows.Markup.BamlRecordReader.ReadRecord(BamlRecord bamlRecord) 在 System.Windows.Markup.BamlRecordReader.Read(布尔单记录) 在 System.Windows.Markup.TreeBuilderBamlTranslator.ParseFragment() 在 System.Windows.Markup.TreeBuilder.Parse() 在 System.Windows.Markup.XamlReader.LoadBaml(流流,ParserContext parserContext,对象父,布尔 closeStream) 在 System.Windows.Application.LoadComponent(对象组件,Uri 资源定位器) 在 c:\Documents and Settings\amciver\My Documents\dev\cyos\cyos\cyos.infrastructure\Views\FileViewerView.xaml 中的 cyos.infrastructure.Views.FileViewerView.InitializeComponent():第 1 行 现在在 cyos.infrastructure.Views.FileViewerView..ctor(FileViewerViewModel viewModel)...

【问题讨论】:

    标签: wpf unity-container prism


    【解决方案1】:

    我不知道数组有什么问题,但是 List 有效。

    【讨论】:

    • 它确实有效......对此有点沮丧......我唯一能想到的是 List = class byte = struct......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多