2016-05-13 5 views
2

Ich versuche, meine Usercontrol zu einer Abhängigkeitseigenschaft in meinem Usercontrol definiert zu binden, selbst, aber ich erhalte eine verbindliche Störung zu erhalten:Fehler beim zu einer Abhängigkeitseigenschaft der gleichen Benutzerkontrolle zu binden versuchen

BindingExpression path error: 'DefinitionTypeResourceKeyProperty' property not found on 'object' ''DefinitionsList' (Name='')'. BindingExpression:Path=DefinitionTypeResourceKeyProperty; DataItem='DefinitionsList' (Name=''); target element is 'ItemsControl' (Name=''); target property is 'ItemTemplate' (type 'DataTemplate')

Das ist mein xAML:

<UserControl x:Class="Editor.Common.DefinitionsList" 
      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" 
      xmlns:local="clr-namespace:Editor.Common" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <local:StringToResourceConverter x:Key="StringToResource" /> 
    </UserControl.Resources> 
    <Expander> 
     <Expander.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Add" 
           Command="{Binding AddItem}" /> 
       <MenuItem Header="Remove" 
           Command="{Binding RemoveItem}" CommandParameter="{Binding SelectedItem}" /> 
      </ContextMenu> 
     </Expander.ContextMenu> 

     <Grid> 
      <ItemsControl ItemsSource="{Binding Items}" ItemTemplate="{Binding DefinitionTypeResourceKeyProperty, Converter={StaticResource StringToResource}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"> 
      </ItemsControl> 
     </Grid> 
    </Expander> 
</UserControl> 

und das ist seine CS-Datei:

using System.Windows; 
using System.Windows.Controls; 

namespace Editor.Common 
{ 
    public partial class DefinitionsList : UserControl 
    { 
     public string DefinitionTypeResourceKey 
     { 
      get { return (string)GetValue(DefinitionTypeResourceKeyProperty); } 
      set { SetValue(DefinitionTypeResourceKeyProperty, value); } 
     } 

     public static readonly DependencyProperty DefinitionTypeResourceKeyProperty = 
      DependencyProperty.Register("DefinitionTypeResourceKey", typeof(string), typeof(DefinitionsList)); 

     public string Header 
     { 
      get { return (string)GetValue(HeaderProperty); } 
      set { SetValue(HeaderProperty, value); } 
     } 

     public static readonly DependencyProperty HeaderProperty = 
      DependencyProperty.Register("Header", typeof(string), typeof(DefinitionsList)); 

     public DefinitionsList() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

ich diese Kontrolle als ge verwenden neric list control, damit ich verschiedene Arten von Steuerelementen in diese Liste einfügen kann.
Dies ist, wie ich versuche, es zu verwenden, um ein für eine bestimmte Art von contorl:

<UserControl x:Class="Editor.Item.ItemEditorControl" 
      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" 
      xmlns:local="clr-namespace:Editor.Item" 
      xmlns:component="clr-namespace:Editor.Component" 
      xmlns:common="clr-namespace:Editor.Common" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <DataTemplate x:Key="compListTemplate"> 
      <component:ComponentListEditorControl /> 
     </DataTemplate> 
    </UserControl.Resources> 
    <common:DefinitionsList Header="{Binding Name}" DefinitionTypeResourceKey="compListTemplate" /> 
</UserControl> 

und seiner CS-Datei:

mit System.Windows.Controls;

namespace Editor.Item 
{ 
    public partial class ItemEditorControl : UserControl 
    { 
     public ItemEditorControl() 
     { 
      InitializeComponent(); 
      DataContext = new ItemDefinitionViewModel(); 
     } 
    } 
} 

Warum erhalte ich diesen Fehler?

EDIT:

Ich füge den ItemDefinitionViewModel Code:

using Editor.Common; 

namespace Editor.Item 
{ 
    public class ItemDefinitionViewModel : BaseViewModel<ItemEditorItem> 
    { 
     public ItemDefinitionViewModel() 
     { 

     } 
    } 
} 

Und seine Basisklasse:

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows.Input; 

namespace Editor.Common 
{ 
    public class BaseViewModel<T> : INotifyPropertyChanged 
        where T : new() 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 


     public ICommand AddItem { get; private set; } 
     public ICommand RemoveItem { get; private set; } 

     public ObservableCollection<T> Items { get; private set; } 

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

     public BaseViewModel() 
     { 
      Items = new ObservableCollection<T>(); 
      AddItem = new RelayCommand(addItem); 
      RemoveItem = new RelayCommand(removeItem); 
     } 

     private void removeItem(object obj) 
     { 
      T removedItem = (T)obj; 
      Items.Remove(removedItem); 
     } 

     private void addItem(object obj) 
     { 
      T newItem = new T(); 
      Items.Add(newItem); 
     } 
    } 
} 
+0

Können Sie Ihr 'ItemDefinitionViewModel' teilen? Ich habe Ihren Code ausprobiert und bekomme keine Fehler, ich denke, vielleicht wegen des unterschiedlichen Datenkontextes. – Pikoh

+0

ok, ich habe es hinzugefügt. – Idov

Antwort

2

Sie binden an DefinitionTypeResourceKeyProperty statt DefinitionTypeResourceKey. Sie versuchen, an die DP-Definition statt an die DP zu binden.

Eine andere Sache, die mich "stört" ist, dass Sie nach einem UserControl in Ihrer RelativeSource RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} suchen.

Stattdessen sollten Sie nach einer Definitionsliste suchen. Wenn Sie das ändern, sagt Ihnen der Editor, dass Sie einen Fehler auf dem DP-Namen gemacht haben, was Ihnen Zeit spart.

Verwandte Themen