WPF绑定和自定义ListView和ListViewItems

时间:2013-09-21 23:41:18

标签: c# wpf wpf-controls wpf-4.0

我需要一个WPF控件,其功能类似于TFS中的'Resolve Conflicts'窗口,以及其他类似的源控制系统。

我有以下课程

 public class Conflict:INotifyPropertyChanged
{
    private string _name;
    private List<Resolution> _resolutions;
    private bool _focused;
    private bool _hasResolutions;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public List<Resolution> Resolutions
    {
        get { return _resolutions; }
        set
        {
            _resolutions = value;
            OnPropertyChanged("Resolutions");
        }
    }

    public bool Focused
    {
        get { return _focused; }
        set { 
            _focused = value;
            OnPropertyChanged("Focused");
        }
    }

    public bool HasResolutions

    {
        get { return _resolutions.Any(); }
        set
        {
            _hasResolutions = value;
            OnPropertyChanged("HasResolutions");
        }
    }
}

public class Resolution
{
    public string Name { get; set; }

    public void Resolve()
    {
        //Logic goes here
    }
}

这几乎与Team Foundation Server(TFS)的“Resolve Conflict”功能相同,如下所示:

enter image description here

对于上图中的每一行,它与我的Conflcit对象相同,对于每个按钮,它们都是Conflict对象上的Resolution对象之一。

我的计划是将我的List绑定到ListView,然后编写一个自定义模板或其他隐藏/显示其下方按钮的内容,具体取决于它是否被选中。

为了简化我需要完成的工作,我有一个List,我想将它绑定到一个控件,它看起来尽可能接近上面的图像。

我将如何完成此操作以及XAML和后面的代码?

1 个答案:

答案 0 :(得分:1)

以下示例说明如何动态创建数据模板,并根据Conflict对象添加按钮:

    public DataTemplate BuildDataTemplate(Conflict conflict)
    {
        DataTemplate template = new DataTemplate();

        // Set a stackpanel to hold all the resolution buttons
        FrameworkElementFactory factory = new FrameworkElementFactory(typeof(StackPanel));
        template.VisualTree = factory;

        // Iterate through the resolution
        foreach (var resolution in conflict.Resolutions)
        {
            // Create a button
            FrameworkElementFactory childFactory = new FrameworkElementFactory(typeof(Button));

            // Bind it's content to the Name property of the resolution
            childFactory.SetBinding(Button.ContentProperty, new Binding("Name"));
            // Bind it's resolve method with the button's click event
            childFactory.AddHandler(Button.ClickEvent, new Action(() => resolution.Resolve());

            // Append button to stackpanel
            factory.AppendChild(childFactory);
        }

        return template;
    }

你可以用许多不同的方式做到这一点,这只是其中之一。 我没有测试过,但这应该足以让你开始:)

祝你好运