2011-02-17 28 views
1

我终于做从的WinForms切换到WPF(3.5),和我想搬过来这个功能:WPF等效的Winforms ListControl.Format事件? (格式化列表项与代表)

我的一个常见的做法是控制的格式通过将委托传递给控件的容器,在Format事件中显示列表/组合框。在“格式事件”中,委托按照我希望的方式显示列表项目的显示文本的格式(例如,通过组合显示项目的属性)。 是否有任何与WPF组合/列表框等​​效的方式来指定一个委托在运行时格式化List Item文本的外观? 谢谢, 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>

回答

0

给大家屏息关注此问题...... 我贴在MS WPF论坛的问题,并从那里回答我觉得对我来说最好的途径是创建一个自定义的IValueConverter,我可以传递一个委托在Convert方法中使用,并将其设置为DataTemplate中的Converter。

+0

我真的很希望这是个玩笑 - 为什么WPF中的一切都变得更加困难!? – 2013-10-09 13:06:03

0

如果您希望将每个项目的格式设置为相同,请查看ListBox.ItemContainerStyle。这将包含每个项目的模板。如果您正在考虑根据某些逻辑更改每个项目的样式,请使用上面的内容以及ListBox.ItemContainerStyleSelector。请参阅MSDN文档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

谢谢,但那不是我想要做的。我想用委托逻辑来格式化,而不是样式。 – user144133 2011-02-18 05:00:02