2016-08-02 8 views
0

Я создал пользовательский элемент управления с некоторыми свойствами зависимостей. Когда я пытаюсь добавить элемент управления в окно, я получаю вид пустого экрана сбоя.Свойства зависимостей в UserControl: значение не было правильным типом, зарегистрированным для свойства dp

Внутреннее наиболее исключение говорит: «Значение не является правильным типа, зарегистрированной для йр собственности» (я надеюсь, что это правильный перевод - нашел его здесь: https://msdn.microsoft.com/de-de/library/ms597473(v=vs.110).aspx)

Я бы перевел его на " Стандартный тип значения не correspont с типом недвижимости «LabelColor»

здесь C# код управления:.

namespace HexButton 
{ 
public partial class HexButtonControl : UserControl 
{ 

    #region Dependency Properties 

    #region LabelText 

    /// <summary> 
    /// Gets or sets the LabelText which is displayed next to the (unit-)rectangle 
    /// </summary> 
    public string LabelText 
    { 
     get { return (string)GetValue(LabelTextProperty); } 
     set { SetValue(LabelTextProperty, value); } 
    } 

    /// <summary> 
    /// Identified the LabelText dependency property 
    /// </summary> 
    public static readonly DependencyProperty LabelTextProperty = 
     DependencyProperty.Register("LabelText", typeof(string), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion 
    #region LabelColor 

    /// <summary> 
    /// Gets or sets the LabelColor (background) which is displayed next to the (unit-)rectangle 
    /// </summary> 
    public Brush LabelColor 
    { 
     get { return (Brush)GetValue(LabelColorProperty); } 
     set { SetValue(LabelColorProperty, value); } 
    } 

    /// <summary> 
    /// Identified the LabelColor dependency property 
    /// </summary> 
    public static readonly DependencyProperty LabelColorProperty = 
     DependencyProperty.Register("LabelColor", typeof(Brush), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion 

    #region RectangleBrush 

    /// <summary> 
    /// Gets or sets the Brush which is used to fill the (unit-)rectangle within the hexagon 
    /// </summary> 
    public Brush RectangleBrush 
    { 
     get { return (Brush)GetValue(RectangleBrushProperty); } 
     set { SetValue(RectangleBrushProperty, value); } 
    } 

    /// <summary> 
    /// Identified the RectangleBrush dependency property 
    /// </summary> 
    public static readonly DependencyProperty RectangleBrushProperty = 
     DependencyProperty.Register("RectangleBrush", typeof(Brush), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion 

    #region HexBackground 

    /// <summary> 
    /// Gets or sets the Brush which is used to fill the background of the hexagon 
    /// </summary> 
    public Brush HexBackground 
    { 
     get { return (Brush)GetValue(HexBackgroundProperty); } 
     set { SetValue(HexBackgroundProperty, value); } 
    } 

    /// <summary> 
    /// Identified the HexBackground dependency property 
    /// </summary> 
    public static readonly DependencyProperty HexBackgroundProperty = 
     DependencyProperty.Register("HexBackground", typeof(Brush), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion 
    #region HexBorderColor 

    /// <summary> 
    /// Gets or sets the Brush which is used to draw the border of the hexagon 
    /// </summary> 
    public Brush HexBorderColor 
    { 
     get { return (Brush)GetValue(HexBorderColorProperty); } 
     set { SetValue(HexBorderColorProperty, value); } 
    } 

    /// <summary> 
    /// Identified the HexBorderColor dependency property 
    /// </summary> 
    public static readonly DependencyProperty HexBorderColorProperty = 
     DependencyProperty.Register("HexBorderColor", typeof(Brush), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion    
    #region HexStokeDashArray 

    /// <summary> 
    /// Gets or sets the the StrokeDashArray for the border of the Hhxagon 
    /// </summary> 
    public DoubleCollection HexStokeDashArray 
    { 
     get { return (DoubleCollection)GetValue(HexStokeDashArrayProperty); } 
     set { SetValue(HexStokeDashArrayProperty, value); } 
    } 

    /// <summary> 
    /// Identified the HexStokeDashArray dependency property 
    /// </summary> 
    public static readonly DependencyProperty HexStokeDashArrayProperty = 
     DependencyProperty.Register("HexStokeDashArray", typeof(DoubleCollection), 
      typeof(HexButtonControl), new PropertyMetadata("")); 

    #endregion 

    #endregion 

    public HexButtonControl() 
    {    
     LayoutRoot.DataContext = this; 
    } 
} 

public class HexModelObject 
{ 
    private string _labelText; 
    public string LabelText 
    { 
     get { return _labelText; } 
     set 
     { 
      _labelText = value; 
      OnPropertyChanged("LabelText"); 
     } 
    } 

    private Brush _labelColor; 
    public Brush LabelColor 
    { 
     get { return _labelColor; } 
     set 
     { 
      _labelColor = value; 
      OnPropertyChanged("LabelColor"); 
     } 
    } 

    private Brush _rectangleBrush; 
    public Brush RectangleBrush 
    { 
     get { return _rectangleBrush; } 
     set 
     { 
      _rectangleBrush = value; 
      OnPropertyChanged("RectangleBrush"); 
     } 
    } 

    private Brush _hexBackground; 
    public Brush HexBackground 
    { 
     get { return _hexBackground; } 
     set 
     { 
      _hexBackground = value; 
      OnPropertyChanged("HexBackground"); 
     } 
    } 

    private Brush _hexBorderColor; 
    public Brush HexBorderColor 
    { 
     get { return _hexBorderColor; } 
     set 
     { 
      _hexBorderColor = value; 
      OnPropertyChanged("HexBorderColor"); 
     } 
    } 

    private DoubleCollection _hexStrokeDashArray; 
    public DoubleCollection HexStrokeDashArray 
    { 
     get { return _hexStrokeDashArray; } 
     set 
     { 
      _hexStrokeDashArray = value; 
      OnPropertyChanged("HexStrokeDashArray"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
} 

и XAML контроля:

<UserControl x:Class="HexButton.HexButtonControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     Height="91" Width="104"> 
     <!--d:DesignHeight="91" d:DesignWidth="104">--> 
<Canvas x:Name="LayoutRoot"> 
    <Polygon Points="27,2 77,2 102,45 77,89 27,89 2,45" 
      StrokeThickness="4" 
      Fill="{Binding Path=HexBackground}" 
      Stroke="{Binding Path=HexBorderColor}" 
      StrokeDashArray="{Binding Path=HexStokeDashArray}"/> 
    <Rectangle 
      Height="70" 
      Width="48" 
      Fill="{Binding Path=RectangleBrush}" 
      Canvas.Left="28" 
      Canvas.Top="10" 
    /> 
    <Label 
     Height="24" 
     Width="14" 
     Padding="0" 
     FontSize="18" 
     FontWeight="Bold"    
     Background="{Binding Path=LabelColor}" 
     Canvas.Left="80" 
     Canvas.Top="31" 
     Content="{Binding Path=LabelText}" />   
</Canvas> 

В главном окне его просто:

<Window x:Class="HexButton.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    xmlns:myControls="clr-namespace:HexButton"> 
<Grid Name="myGrid"> 
    <myControls:HexButtonControl x:Name="UC1" 
     HexBackground="AliceBlue" HexBorderColor="Black" RectangleBrush="Green" LabelColor="Beige" LabelText="asdf"> 
    </myControls:HexButtonControl> 
</Grid> 
</Window> 

Я привязан к из комментария свойства зависимостей LabelColor, но затем происходит сбой в RectangleBrush так я думаю, что его проблема с Кисть. Я дважды проверял свойства - Фон свойство Ярлык имеет тип (System.Windows.Media.) Brush. Может быть, это потому, что Brush не имеет значения по умолчанию? Если да, то как я его установил?

Я выяснил, что удаление PropertyMetadata помогает решить проблемы с недвижимостью. Но затем я получаю еще одно исключение в constuctor с «LayoutRoot.DataContext = this;» который является исключением NullReferenceException для LayoutRoot.

Я создал HexButtonControl следующего http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html

ответ

0

В вашем свойстве зависимостей, то new PropertyMetadata() аргумента значение по умолчанию свойства. Ваше свойство имеет тип Brush, и вы передаете строку в качестве значения по умолчанию. Эта ошибка происходит и в других свойствах. Попробуйте это, или другой кисти вам нравится:

public static readonly DependencyProperty LabelColorProperty = 
    DependencyProperty.Register("LabelColor", typeof(Brush), 
     typeof(HexButtonControl), new PropertyMetadata(Brushes.Black)); 

Edit: К сожалению, пропустил последнюю часть. Мне кажется, что вы пропустили InitializeComponent(); вызов в конструкторе, перед линией установить DataContext:

public HexButtonControl() 
{ 
    InitializeComponent(); 
    LayoutRoot.DataContext = this; 
} 
+0

вы правы :). Не удалось инициализировать элемент InitializeComponent(). OMG я чувствую себя самым глупым человеком в истории кодирования ... :( – Thoms

+0

@Thoms Это случается. Иногда нам нужна новая пара глаз (это выражение на английском?), Чтобы узнать ошибки, которые мы не видим. – Magnetron