基于内容对列表框中的项目的不同视图

时间:2010-09-19 04:27:50

标签: silverlight listbox

我有一个带有这样的界面的项目列表

public interface INamedItem
{
    string DisplayName
    {
        get;
    }
}

在silverlight中,我可以绑定到列表框并显示显示名称,这样就可以了。

但是,根据DisplayName的值,我想以不同的方式显示它(使用不同的DataTemplate?)。

如果DisplayName有两个'\ t',我希望第一个标签前的文字左对齐,标签之间的文字居中,文本的其余部分右对齐。

有没有简单的方法可以做到这一点?我发布了一个“回答”,我在谷歌发现添加这篇文章后发现,但我觉得他们必须是一个更好的方式。

1 个答案:

答案 0 :(得分:0)

所以这似乎有用(http://weblogs.asp.net/joewrobel/archive/2009/01/25/conditional-formatting-in-the-silverlight-datagrid.aspx)(忽略带列的固定)。

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        INamedItem namedItem = value as INamedItem;
        if (namedItem == null)
        {
            TextBlock block = new TextBlock();
            block.Text = "";
            return block;
        }

        string[] tabSeperatedParts = namedItem.DisplayName.Split('\t');

        if (tabSeperatedParts.Count() != 3)
        {
            TextBlock block = new TextBlock();
            block.Text = namedItem.DisplayName;
            return block;
        }
        else
        {
            Grid grid = new Grid();
            grid.RowDefinitions.Add(new RowDefinition());
            for (int i = 0; i < 3; ++i)
            {
                ColumnDefinition col = new ColumnDefinition();
                col.MinWidth = 220;
                grid.ColumnDefinitions.Add(col);
                TextBlock text = new TextBlock();
                text.Text = tabSeperatedParts[i];
                grid.Children.Add(text);
                Grid.SetColumn(text, i);
            }
            ((TextBlock)grid.Children[0]).TextAlignment = TextAlignment.Left;
            ((TextBlock)grid.Children[1]).TextAlignment = TextAlignment.Center;
            ((TextBlock)grid.Children[2]).TextAlignment = TextAlignment.Right;
            return grid;
        }
    }

    <ScrollViewer.Resources>
        <magecrawlList:ListItemValueConverter x:Key="ItemConverter"/>
    </ScrollViewer.Resources>
    <ListBox ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding Converter={StaticResource ItemConverter}}" HorizontalContentAlignment="Stretch" 
                                VerticalContentAlignment="Stretch" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>