2017-01-12 5 views
1

Вот кусок моего XAML:как связать значение свойства столбца TreeView в WPF

<Grid> 
       <dxg:TreeListControl x:Name="HierarchyTreeControl" ItemsSource="{Binding MenuItems}" EnableSmartColumnsGeneration="False" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" SelectionMode="Row" AutoGenerateColumns="None"> 
        <dx:TreeListColumn FieldName="Name" Header="Title" Width="50" /> 
        <dx:TreeListColumn FieldName="URL" Header="Link" Width="150" />    
        <dx:TreeListColumn Binding="{Binding HasChildren}" Header="Has any children" Width="20" BestFitArea="Header" AllowResizing="False" ShowInColumnChooser="True" Visible="True" > 
         <dx:TreeListColumn.EditSettings> 
          <dxe:CheckEditSettings /> 
         </dx:TreeListColumn.EditSettings> 
        </dx:TreeListColumn> 
        <dx:TreeListColumn Binding="{Binding IsChecked}" Header="Удалить" ReadOnly="False" AllowEditing="{Binding Path=HasChildren, Converter={StaticResource BoolToFalseConverter}, UpdateSourceTrigger=PropertyChanged}" Width="20" BestFitArea="Header" AllowResizing="False" ShowInColumnChooser="True" Visible="True" > 
         <dx:TreeListColumn.EditSettings> 
          <dxe:CheckEditSettings /> 
         </dx:TreeListColumn.EditSettings> 
        </dx:TreeListColumn> 
        <dxg:TreeListControl.View> 
         <dxg:TreeListView AllowPerPixelScrolling="True" ShowTotalSummary="False" KeyFieldName="ID" ParentFieldName="ParentID" TreeDerivationMode="Selfreference" AllowEditing="False" AutoExpandAllNodes="False" FetchSublevelChildrenOnExpand="False" AllowColumnMoving="False" AutoWidth="True" ShowNodeImages="False" /> 
        </dxg:TreeListControl.View> 
       </dxg:TreeListControl> 
      </Grid> 

где источник {MenuItems} является ObservableCollection<MenuItem>

Я хотел бы, чтобы позволить, чтобы проверить флажок в последнем столбце, только если свойство MenuItem.HasChildren = ложные

Я пытаюсь сделать с этим кодом:

AllowEditing = "{Binding Path = HasChildren, конвертер = {StaticResource BoolToFalseConverter}, UpdateSourceTrigger = PropertyChanged}"

Но это не работает, и я вижу, что преобразователь BoolToFalseConverter вызывает только один раз, для первой строки

Как выполнить задачу?

Update: Вот класс MenuItem

public class MenuItem : INotifyPropertyChanged 
    { 
     private int _id; 
     public int ID 
     { 
      get {return _id;} 
      set 
      { 
       if (_id == value) 
        return; 
       _id = value; 
       OnPropertyChanged("ID"); 
      } 
     } 

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

     private string _url; 
     public string URL 
     { 
      get 
      { 
       return _url; 
      } 
      set 
      { 
       if (_url == value) 
        return; 
       _url = value; 
       OnPropertyChanged("URL"); 
      } 
     } 

     private int _target; 
     public int Target 
     { 
      get{return _target;} 
      set 
      { 
       if (_target == value) 
        return; 
       _target = value; 
       OnPropertyChanged("Target"); 
      } 
     } 
     private int? _parentID; 
     public int? ParentID 
     { 
      get{return _parentID;} 
      set 
      { 
       if ((_parentID == null && value == null) || _parentID == value) 
        return; 
       _parentID = value; 
       OnPropertyChanged("ParentID"); 
      } 
     } 

     public bool HasChildren { get; set; } 

     private bool _isChecked; 
     public bool IsChecked 
     { 
      get{return _isChecked;} 
      set 
      { 
       if (_isChecked == value) 
        return; 
       _isChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 

     protected void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

ответ

1

Я предполагаю, что HasChildren относится к "вид" детей. В этом случае вам понадобится выделенный конвертер (или, еще лучше, поведение), который опубликует событие. Модель просмотра будет подписана на событие, и после ее получения будет установлено значение true или false значение HasChildren и уведомление свойства Is Checked для уведомления о представлении.

Если HasChildren относится к объекту viewmodel, это просто способ проверки чека в модели представления и уведомление о представлении.

Обновление от комментариев:

Я нашел этот вопрос в DevExpress форуме, который говорить именно о вашем вопросе =>devexpress.com/Support/Center/Question/Details/Q367068 Они говорят, там вы должны использовать TreeListView.ShowingEditor событие, которое при вызове вы можете разрешить или отключить редактирование конкретных ячеек

+0

HasChildren - это просто свойство bool MenuItem, только для чтения. –

+0

HasChildren получает свое значение в некотором роде, моя догадка по вашему комментарию заключается в том, что он из поля. Я бы предложил изменить свойство HasChildren, чтобы получить & внутренний набор, чтобы он не изменялся извне класса, а затем в методе «set» обновлялось значение IsChecked. –

+0

Я не хочу обновлять свойство HasChildren. Моя идея - изменить свойство AllowEditing этого флажка, основанное на значении HasChildren для каждой строки в treeview. –

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