我需要一个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”功能相同,如下所示:
对于上图中的每一行,它与我的Conflcit对象相同,对于每个按钮,它们都是Conflict对象上的Resolution对象之一。
我的计划是将我的List绑定到ListView,然后编写一个自定义模板或其他隐藏/显示其下方按钮的内容,具体取决于它是否被选中。
为了简化我需要完成的工作,我有一个List,我想将它绑定到一个控件,它看起来尽可能接近上面的图像。
我将如何完成此操作以及XAML和后面的代码?
答案 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;
}
你可以用许多不同的方式做到这一点,这只是其中之一。 我没有测试过,但这应该足以让你开始:)
祝你好运