2014-01-15 54 views
2

我有這樣的DataGridComboBoxColumn:綁定ClipboardContentBinding到的DisplayMemberPath

<DataGridComboBoxColumn 
    SelectedValueBinding="{Binding 
     Path=Offset, 
     Mode=TwoWay, 
     UpdateSourceTrigger=PropertyChanged}" 
    DisplayMemberPath="Key" 
    SelectedValuePath="Value"> 

... 

    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter 
       Property="ItemsSource" 
       Value="{Binding 
        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, 
        Path=DataContext.Offsets}" /> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
</DataGridComboBoxColumn> 

的ElementStyle結合這樣ComboboxPairs的列表:

public ObservableCollection<ComboboxPair<float>> Offsets { get; set; } 

Offsets = new ObservableCollection<ComboboxPair<float>> 
{ 
    new ComboboxPair<float> 
    { 
     Key = "Item 1", 
     Value = 1.23 
    } 
    ... 
}; 

而且ComboboxPair看起來是這樣的:

public class ComboboxPair<T> 
{ 
    public string Key { get; set; } 
    public T Value { get; set; } 
} 

這使我可以在組合框中顯示一個有用的名字,但要將一個浮點數綁定到t他在用戶選擇一個值時查看模型。但是,當我選擇一行並複製它時,我會得到浮點值。我想獲得有用的名字。有沒有辦法將DataGridComboBoxColumn的ClipboardContentBinding綁定到它的DisplayMemberPath,還是這是錯誤的方法?我還能怎麼做?

回答

2

你可以聽CopyingCellClipboardContent event

<DataGridComboBoxColumn x:Name="comboColumn" CopyingCellClipboardContent="OnCopying" ... /> 

的處理程序是這樣的:

void OnCopying(object sender, DataGridCellClipboardEventArgs args) 
{ 
    if (args.Column == comboColumn && args.Item as ComboBox<float> != null) 
     args.Content = ((ComboBox<float>)args.Item).Key; 
} 

另外,如果你想繼承的DataGridComboBoxColumn類,你可以覆蓋其OnCopyingCellClipboardContent方法:

public class CustomDataGridComboBoxColumn : DataGridComboBoxColumn 
{ 
    public override object OnCopyingCellClipboardContent(object item) 
    { 
     if (item as ComboboxPair<float> is null) 
      return null; 
     return ((ComboboxPair<float>)item).Key; 
    } 
} 
+1

這幾乎可行。 args.Item原來是綁定到datagrid行的項目,而不是綁定到單元格的float。但它讓我意識到我可以創建一個「FriendlyOffset」屬性並將其綁定到ClipboardContentBinding。謝謝 :) – ConditionRacer