簡體   English   中英

不保留在WPF中的擴展工具包值

[英]Extended toolkit values not retaining in WPF

我有一個WPF Datagrid,我想在其中實現一個CheckCombobox列。 我下載了extendedToolkit,如下所示,

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

我的問題是,在列失去焦點時,所有檢查的值都會消失,因此當下次打開時,我將擁有所有默認值。 任何人都可以讓我知道我哪里錯了... 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;
    }
}

我將向你展示如何使用這個控件:

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

SelectableOptions是SelectableOption類型的Observable集合:

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

關於此控件的文檔有點稀疏。 希望這會有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM