CSharp - 将ClipboardContentBinding绑定到 DisplayMemberPath

  显示原文与译文双语对照的内容

我有一个类似这样的DataGridComboBoxColumn:


<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的List,如下所示:


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

这样可以在组合框中显示一个有用的名称,但是当用户选择一个值时,将一个浮动绑定到 viewmodel 。 但是,当我选择一行并复制它时,我得到浮点值。 我想得到有用的名字。 是否有办法将datagridcomboboxcolumn的ClipboardContentBinding绑定到 DisplayMemberPath,或者这是错误的方法? 我该怎么做?

时间: 作者:

你可以侦听 CopyingCellClipboardContent事件:


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

作者:
...