WPF等效的Winforms ListControl.Format事件? (使用代理格式化列表项)

时间:2011-02-17 23:56:28

标签: wpf

我终于从Winforms切换到WPF(3.5),我试图将此功能转移到:

我的常见做法是通过将委托传递给控件的容器来控制Format事件中列表/组合框显示的格式。在格式事件中,委托格式化列表项的显示文本,如我希望它出现(例如,通过组合显示项的属性)。 是否有任何与WPF组合/列表框等​​效的方法来指定用于在运行时格式化列表项文本外观的委托? 谢谢, YS

仅供参考 - 我在这里试图了解,如我的回答所述:

代码隐藏:

public partial class MainWindow : Window
{

    private List<Foo> l = new List<Foo>();
    //Formatting done by delegate, passed to converter.
    MyConverter<Foo>  cv = new MyConverter<Foo>(f=> "#" + f.ID + " = " + f.Name);
    public MainWindow()
    {
        Resources.Add("myConverter", cv);
        l.Add(new Foo(){ID=1, Name = "aaaa aaaa"});
        l.Add(new Foo(){ID=2, Name = "bbbb bbbb "});
        DataContext = l;
        InitializeComponent();
    }
}


public class Foo
{

    public int ID { get; set; }
    public string Name { get; set; }


}


public class MyConverter<T> : IValueConverter
{
    private Func< T, string> _formatter { get; set; }
    public MyConverter(Func<T, string> Formatter)
    {
        _formatter = Formatter;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return _formatter((T)value);
    }

}

然后在xaml中:

<ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Converter={StaticResource ResourceKey=myConverter}}"> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate>

2 个答案:

答案 0 :(得分:0)

如果您希望格式化每个项目,请查看ListBox.ItemContainerStyle。这将包含每个项目的模板。如果您正在考虑根据某些逻辑更改每个项目的样式,请使用上面的ListBox.ItemContainerStyleSelector。请参阅msdn doc http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainerstyle.aspxhttp://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainerstyleselector.aspx

答案 1 :(得分:0)

对于每个人都气喘吁吁地关注这个问题...... 我在MS WPF论坛上发布了这个问题,从答案中我认为最好的方法是创建一个自定义的IValueConverter,我可以传入一个委托在Convert方法中使用,并将其设置为转换器中的DataTemplate中。