2013-09-21 2 views
0

Мне нужен элемент управления WPF, который работает аналогично окну «Разрешить конфликты» в TFS и других подобных системах управления версиями.WPF Binding и Custom ListView и ListViewItems

У меня есть следующие классы

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) 'разрешение конфликтов' показано ниже окно:

enter image description here

Для каждой строки в изображении выше, это то же самое, что и мой объект Conflcit, и для каждой из кнопок был бы одним из объектов Resolution на объекте Conflict.

Мой план состоял в том, чтобы связать мой список с ListView, а затем написать собственный шаблон или что-то еще, чтобы скрыть/показать кнопки под ним на основе того, был ли он выбран или нет.

Чтобы попытаться упростить то, что мне нужно для достижения, у меня есть список, и я хочу привязать его к элементу управления, и он будет выглядеть как можно ближе к изображению сверху.

Как бы это сделать и XAML и код позади?

+0

Я только попытался сделать пользовательские ItemTemplate, но я не очень далеко. Проблема, с которой я сталкиваюсь, я не знаю, как динамически добавлять кнопки для каждого из объектов Resolution, которые у меня есть. Его почти как, мне нужен «повторитель» для каждого объекта разрешения при каждом конфликте. – TheJediCowboy

ответ

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

Вы можете сделать это по-разному, и это только один из них. я не проверял, но это должно быть достаточно, чтобы вы начали :)

удачи

+0

Как я устанавливаю это? Установлено ли это в ListView? Это похоже на то, что мне нужно, но я пытаюсь проверить его и не знаю, как установить его, чтобы я мог его протестировать. – TheJediCowboy

+0

У меня это работает, но одно странное - вызов SetBinding (..) является обязательным для имени конфликта, а не имени разрешения, поэтому я использую SetValue и просто передаю имя имени. – TheJediCowboy

+0

@CitadelCSAlum 'SetBinding()' работает точно так же, как механизм привязки через xaml, и работает в соответствии с его текущим кодом данных. Таким образом, чтобы привязка «Name» отображала имя разрешения, вам необходимо привязать вашу коллекцию 'Resolutions' к некоторым элементам ItemsControls, таким как' ListBox \ DataGrid' или 'ItemsControl', и применить этот' DataTemplate' к нему. –

Смежные вопросы