TreeListControl не обновляет значения потомков сразу - PullRequest
0 голосов
/ 27 июня 2019

Я пользуюсь DevExpress.У меня есть TreeListControl.Один столбец состоит из комбинированных списков (реализованных ComboBoxEditSettings) с несколькими значениями.Когда я устанавливаю значение в Combobox для родителя, его дочерние элементы будут обновляться только тогда, когда я меняю фокус или нажимаю Enter, но не сразу.

Вот некоторые пункты, которые я уже пробовал:

  1. Установите Событие в ComboBoxEditSettings для взаимодействия, например MouseUp;
  2. Установите EventToCommand для eventName EditValueChanged, например.Привязка не работает;
  3. Установите событие на OkButton_Click, но я не нашел, как получить событие OkButton_Click в Combobox.
  4. Создайте CustomButton в ComboboxEdit и установите событие PopUpClose.В этом случае привязка работает, но я не нашел, как установить MyCustomButton для события OkButton.

    Вот часть моего кода.Может быть, это поможет понять мой случай.

<dxg:TreeListControl x:Name="Tree" ItemsSource="{Binding TreeItems, Mode=TwoWay}">
            <dxg:TreeListControl.Columns>
                <dxg:TreeListColumn FieldName="Node"/>
                <dxg:TreeListColumn FieldName="Frequency"/>
                <dxg:TreeListColumn.EditSettings>                        
                   <dxe:ComboBoxEditSettings ItemsSource="{Binding Samplers}" IsTextEditable="False" DisplayMember="SamplerLongText" ValueMember="SamplerId">
<dxe:ComboBoxEditSettings.StyleSettings>
                        <dxe:CheckedComboBoxStyleSettings/>
                          </dxe:ComboBoxEditSettings.StyleSettings>
                        </dxe:ComboBoxEditSettings>
                    </dxg:TreeListColumn.EditSettings>
                    </dxg:TreeListColumn>
               </dxg:TreeListControl.Columns>
            <dxg:TreeListControl.View>
               <dxg:TreeListView                     
                    x:Name="TreeListView" 
                    AllowPerPixelScrolling="True" 
                    ShowTotalSummary="True"  
                    KeyFieldName="TreeItemId"                    
                    ParentFieldName="ParentId" 
                    ShowCheckboxes="true" 
                    CheckBoxFieldName="IsChecked"
                    IsCheckBoxEnabledFieldName="IsEnable"                 
                    AllowRecursiveNodeChecking="True" 
                    ShowNodeImages="True" 
                    AutoWidth="True"
                    ImageFieldName="NodeImage"/>
            </dxg:TreeListControl.View>           
        </dxg:TreeListControl>

Заранее спасибо!

1 Ответ

0 голосов
/ 27 июня 2019

У нас есть этот маленький вспомогательный класс для точно такой же функциональности при использовании CheckEdits, но он также должен работать для ваших ComboBoxEdits. Помните, что он использует событие EditValueChang ing под капотом, которое может уже ответить на ваш вопрос.

public partial class EditorCommitHelper
{
    public static readonly DependencyProperty CommitOnValueChangedProperty = DependencyProperty.RegisterAttached("CommitOnValueChanged", typeof(bool), typeof(EditorCommitHelper), new PropertyMetadata(CommitOnValueChangedPropertyChanged));

    public static void SetCommitOnValueChanged(GridColumn element, bool value)
    {
        element.SetValue(CommitOnValueChangedProperty, value);
    }
    public static bool GetCommitOnValueChanged(GridColumn element)
    {
        return (bool)element.GetValue(CommitOnValueChangedProperty);
    }

    private static void CommitOnValueChangedPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        GridColumn col = source as GridColumn;
        if (col.View == null)
            Dispatcher.CurrentDispatcher.BeginInvoke(new Action<GridColumn, bool>((column, subscribe) => {
                ToggleCellValueChanging(column, subscribe);
            }), col, (bool)e.NewValue);
        else
            ToggleCellValueChanging(col, (bool)e.NewValue);
    }

    private static void ToggleCellValueChanging(GridColumn col, bool subscribe)
    {
        TreeListView view = col.View as TreeListView;
        if (view == null)
            return;

        if (subscribe)
            view.CellValueChanging += new CellValueChangedEventHandler(view_CellValueChanging);
        else
            view.CellValueChanging -= view_CellValueChanging;
    }

    static void view_CellValueChanging(object sender, CellValueChangedEventArgs e)
    {
        TreeListView view = sender as TreeListView;

        if ((bool)e.Column.GetValue(CommitOnValueChangedProperty))
            view.PostEditor();
    }
}

использование:

<dxg:GridColumn Header="your header"
                FieldName="your_field"
                your_xmlns:EditorCommitHelper.CommitOnValueChanged="True">
</dxg:GridColumn>
...