0

我需要一个 WPF 控件,其功能类似于 TFS 中的“解决冲突”窗口,以及其他类似的源代码控制系统。

我有以下课程

 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) 的“解决冲突”窗口的功能几乎相同,如下所示:

在此处输入图像描述

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

我的计划是将我的 List 绑定到 ListView,然后编写一个自定义模板或其他任何东西来根据它是否被选中来隐藏/显示它下面的按钮。

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

我将如何完成这个和 XAML 以及背后的代码?

4

1 回答 1

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;
    }

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

祝你好运

于 2013-09-22T06:24:16.967 回答