2016-02-05 89 views
0

我已经创建了一个基于具有两个依赖项属性的列表框的非常基本的自定义控件。这些依赖属性称为SourceASourceB。这两个依赖属性公开给用户绑定。目标是让我有多个绑定插槽的集合。迄今为止效果很好。基于列表框的自定义wpf控件

在我的自定义控件中,我将这两个列表合并为一个,然后显示在列表框中,如下图所示。

我的问题是?

我需要一种方法来将这些项目相互区分后再进行区分。因此,当我展开自定义控件时,我仍然知道后端列表中哪些项来自SourceA或SourceB。原因是我可以将特定功能添加到SourceA与SourceB中的项目。

有没有办法让我在自定义控件中标记两个传入列表项?一个枚举,接口或包装是一个解决方案吗?

DropBox的解决方案:https://www.dropbox.com/s/74su534n1szk91b/NexusEditor_03.zip?dl=0

<Grid> 
    <nexus:NexusEditor 
     SourceB="{Binding ItemList}" 
     SourceA="{Binding GroupList}"/> 
</Grid> 

Thanks

+0

这是很难承担很多事情,我建议张贴一些代码和问具体问题。 –

+0

@HariPrasad我已经用这些文件更新了这个问题。让我知道你的想法。 – JokerMartini

回答

1

好了,根据您当前的实现,你就必须有一个方法来识别物体的类型,不论其来源。所以最简单的事情就是创建一个你控制的包装器对象,并且可以添加任何想要跟踪对象的信息。事情是这样的:

public class NexusItem 
{ 
    public object Item { get; set; } 
    public Brush Background { get; set; } 
} 

然后修改UpdateItems方法添加的跟踪数据:

 private static void UpdateItems(NexusEditor editor) 
    { 
     editor.Items.Clear(); 

     var sourceB = editor.SourceB as IEnumerable; 
     if (sourceB != null) 
     { 
      foreach (object obj in sourceB) 
      { 
       var item = new NexusItem() { Item = obj, Background = new SolidColorBrush(Colors.Green) }; 
       editor.Items.Add(item); 
      } 
     } 

     var sourceA = editor.SourceA as IEnumerable; 
     if (sourceA != null) 
     { 
      foreach (object obj in sourceA) 
      { 
       var item = new NexusItem() { Item = obj, Background = new SolidColorBrush(Colors.Red) }; 
       editor.Items.Add(item); 
      } 
     } 
    } 

现在,您可以更新您的模板绑定到你期望的数据:

<DataTemplate> 
    <TextBlock Background="{Binding Background}" Grid.Column="1" Grid.Row="1" 
       Text="{Binding Item.Name}" 
       HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </DataTemplate> 

enter image description here

现在,说了这么多,我想你会遇到其他问题,基于当前控制体系结构的限制,因为您已经对模板中的传入对象进行了假设。也许你不会,这将适合你的需求,但很好。

+0

我的模板只是暂时的,即时将最终使他们,使用户可以定义它们。这样他们可以控制什么被束缚,什么不能。 – JokerMartini