基于列表框的自定义wpf控件

时间:2016-02-05 02:34:24

标签: c# wpf

我已经基于具有两个依赖项属性的列表框创建了一个非常基本的自定义控件。这些依赖项属性称为 SourceA SourceB 。这两个依赖项属性是公开的,供用户绑定。我的目标是为集合提供多个绑定槽。到目前为止效果很好。

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

我的问题?

我需要一种方法来在组合它们之后区分彼此。因此,当我扩展自定义控件时,我仍然在后端知道列表中的哪些项来自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

1 个答案:

答案 0 :(得分: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

现在,话虽如此,我认为您将根据当前的控件架构遇到其他问题和限制,因为您已经对模板中的传入对象进行了假设。也许你赢了,但这很适合你的需求。