2014-01-04 2 views
0

У меня есть Datagrid WPF, и я хочу реализовать в нем столбец CheckCombobox. Я скачал extendedToolkit и сделал, как показано ниже,Расширенные значения инструментария не сохраняются в WPF

<DataGridTemplateColumn Header="Operation" MinWidth="150" Width="*"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding SelectedOperations,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True,NotifyOnValidationError=True}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 

       <my:CheckComboBox x:Name="_combo" Width="150" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center" 
            ItemsSource="{Binding Path=AllOperations,UpdateSourceTrigger=Default}" 
                 DisplayMemberPath="OperationName" 
                 ValueMemberPath="OperationName" 
                 SelectedItem="{Binding SelectedOperation, Mode=TwoWay}" 
               ItemSelectionChanged="_combo_ItemSelectionChanged" SelectedValue="{Binding SelectedOperations, Mode=TwoWay}" 
               /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 

Моя проблема, на потерянном фокусе колонки все проверенное значение, таким образом, исчезает, когда в следующий раз, он открывает у меня есть все значения по умолчанию. Может кто-нибудь пожалуйста, дайте мне знать, где я буду неправильно ... The ViewModel показано ниже (только показали ту часть, которая используется в коде ниже)

public ObservableCollection<OperationMasterVM> AllOperations 
{ 
    get 
    { 
     //SelectedOperation.Clear(); 
     return DAL.GetAllOperations(); 
    } 
} 

private Dictionary<string,string> _operation = new Dictionary<string,string>(); 
public Dictionary<string, string> SelectedOperation 
{ 
    get 
    { 
     return _operation; 
    } 
    set 
    { 
     _operation = value; 
    } 
} 

private string _selectedOperations; 
public string SelectedOperations 
{ 
    get 
    { 
     _selectedOperations = string.Empty; 
     if (SelectedOperation.Any()) 
     { 
      foreach (var operation in SelectedOperation) 
      { 
       if (string.IsNullOrEmpty(_selectedOperations)) 
       { 
        _selectedOperations = operation.Value; 
       } 
       else 
       { 
        _selectedOperations = _selectedOperations + ", " + operation.Value; 
       } 
      } 
     } 

     return _selectedOperations; 
    } 

    set 
    { 
     _selectedOperations = value; 
    } 
} 
+0

Что такое 'CheckComboBox'? Как это реализовано? – Alberto

+0

У вас долгий путь впереди ваших и драконов. Удачи, что ваша клавиатурная навигация будет работать стандартным образом. –

ответ

2

Я собираюсь принять удар на это показывая вам, как я использую этот контроль:

<xctk:CheckComboBox x:Name="cboResults" 
          KeyDown="CheckComboBox_OnKeyDown" 
          ItemsSource="{Binding Path=SelectableOptions}" 
          DisplayMemberPath="Display" 
          ValueMemberPath="Value" 
          SelectedMemberPath="IsSelected"/> 

Где SelectableOptions является наблюдаемая коллекция типа SelectableOption:

public class SelectableOption 
{ 
    public string Display { get; set; } 
    public string Value { get; set; } 
    public bool IsSelected { get; set; } 
} 

Вы не должны строить строки с разделителями выбранных опций. Это создается, когда вы делаете выбор и сворачиваете выпадающее меню.

Я также отметил, что один из вышеупомянутых комментариев упоминается клавиатура навигация. Я обработал это, создав обработчик события KeyDown, так что, когда CheckComboBox имеет фокус, и пользователь нажимает клавишу пробела, откроется раскрывающийся список.

private void CheckComboBox_OnKeyDown(object sender, KeyEventArgs e) 
{ 
    var obj = (CheckComboBox) sender; 
    if (e.Key == Key.Space) 
    { 
     obj.IsDropDownOpen = !obj.IsDropDownOpen; 
    } 
} 

Документация по этому контролю является видом редкой. Надеюсь, это немного поможет.

+0

Спасибо, что помогли мне кучи. Я тоже терял значения, пока не добавил свойство IsSelected на свой объект и добавил его к привязке SelectedMemberPath – David

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