2010-05-26 2 views
0

У меня проблема, и я еще не нашел решение. Я хотел бы создать базовый пользовательский элемент управления и использовать его в другом настраиваемом элементе управления. Базовый элемент управления отлично работает, когда я использую его в окне, но когда я использую его в другом настраиваемом элементе управления, привязка не работает.Проблема с пользовательским управлением WPF

Что случилось с моим кодом?

Код:

Модель:

public class ElementModel 
{ 
    public string Name { get; set; } 
    public string FullName { get; set; } 
} 

База управления:

public class ListControl : Control 
{   
    static ListControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ListControl), new FrameworkPropertyMetadata(typeof(ListControl))); 
    } 

    public ListControl() 
    { 
     SetValue(ElementListProperty, new List<ElementModel>()); 
    } 

    public static readonly DependencyProperty ElementListProperty = 
     DependencyProperty.Register(
     "ElementList", 
     typeof(List<ElementModel>), 
     typeof(ListControl), 
     new FrameworkPropertyMetadata(new List<ElementModel>()) 
    ); 

    public List<ElementModel> ElementList 
    { 
     get { return (List<ElementModel>)GetValue(ElementListProperty); } 
     set { SetValue(ElementListProperty, value); } 
    } 
} 

обертка управления:

public class ListWrapper : Control 
{ 
    static ListWrapper() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ListWrapper), new FrameworkPropertyMetadata(typeof(ListWrapper))); 
    } 

    public ListWrapper() 
    { 
     SetValue(EMListProperty, new List<ElementModel>()); 
    } 

    public static readonly DependencyProperty EMListProperty = 
     DependencyProperty.Register(
     "EMList", 
     typeof(List<ElementModel>), 
     typeof(ListWrapper), 
     new FrameworkPropertyMetadata(new List<ElementModel>()) 
    ); 

    public List<ElementModel> EMList 
    { 
     get { return (List<ElementModel>)GetValue(EMListProperty); } 
     set { SetValue(EMListProperty, value); } 
    } 
} 

Файл Generic.xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:UIControl"> 

<Style TargetType="{x:Type local:ListControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ListControl}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 

        <ListBox ItemsSource="{TemplateBinding ElementList}"> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <Label Content="Name:"/> 
            <TextBlock Text="{Binding Path=Name}" /> 
            <Label Content="Full name:"/> 
            <TextBlock Text="{Binding Path=FullName}" /> 
           </StackPanel> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="{x:Type local:ListWrapper}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ListWrapper}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 

        <local:ListControl ElementList="{TemplateBinding EMList}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Если я ставлю элементы управления в окне и связывающими свойствами, чем ListControl прекрасно работает и показывает элементы, но WrapperList не делает.

<Window x:Class="MainApplication.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:ui="clr-namespace:UIControl;assembly=UIControl" 
Title="Window1" Height="304" Width="628"> 
<Grid> 
    <ui:ListControl x:Name="listCtr" ElementList="{Binding Path=EList}" HorizontalAlignment="Left" Width="300" /> 
    <ui:ListWrapper x:Name="listWrp" EMList="{Binding Path=EList}" HorizontalAlignment="Right" Width="300" Background="Gray"/> 
</Grid> 

И инъекции тест данные:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 

    List<ElementModel> elist = null; 
    public List<ElementModel> EList 
    { 
     get 
     { 
      if (elist == null) 
      { 
       elist = new List<ElementModel>(); 
       ElementModel em = new ElementModel() { Name = "Apple", FullName = "Red Apple" }; 
       elist.Add(em); 

       em = new ElementModel() { Name = "Pineapple", FullName = "Yellow Pineapple" }; 
       elist.Add(em); 
      } 
      return elist; 
     } 
    } 
} 

Project archive

+0

Пожалуйста, объясните, что «привязка не работает». Что такое «привязка»? –

+0

Я добавил отсутствующий пример, я надеюсь, что это поможет найти мою ошибку. – josika

ответ

2

Я не знаю почему, но если я должен обернуть этот список элементов (List) в новый тип коллекции (пример ElementCollection: ObservalbeCollection) и использовать этот тип коллекции в свойстве зависимостей, он отлично работает ...

public static readonly DependencyProperty EMListProperty = 
    DependencyProperty.Register(
    "EMList", 
    typeof(ElementCollection), 
    typeof(ListWrapper), 
    new FrameworkPropertyMetadata(new ElementCollection()) 
); 

public ElementCollection EMList 
{ 
    get { return (ElementCollection)GetValue(EMListProperty); } 
    set { SetValue(EMListProperty, value); } 
} 
0

я не мог найти где-нибудь, где вы устанавливаете привязки контекст:

http://msdn.microsoft.com/en-us/library/ms752347.aspx

+0

Я добавил вопрос с инициализацией пробных данных. У меня нет разрешения поставить вопрос на экран печати, но у элемента управления left1 слева есть элементы, но правой стороны нет. – josika

Смежные вопросы