【问题标题】:Bind ClipboardContentBinding to DisplayMemberPath将 ClipboardContentBinding 绑定到 DisplayMemberPath
【发布时间】:2014-01-15 22:05:14
【问题描述】:

我有一个像这样的 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 列表,如下所示:

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

这允许我在组合框中显示一个有用的名称,但在用户选择一个值时将一个浮点数绑定到视图模型。但是,当我选择一行并复制它时,我得到了浮点值。我想得到有用的名字。有没有办法将 DataGridComboBoxColumn 的 ClipboardContentBinding 绑定到它的 DisplayMemberPath,或者这是错误的方法?我还能怎么做?

【问题讨论】:

    标签: c# wpf xaml datagrid clipboard


    【解决方案1】:

    你可以听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;
        }
    }
    

    【讨论】:

    • 这几乎可以工作。 args.Item 原来是绑定到数据网格行的项目,而不是绑定到单元格的浮点数。但它让我意识到我可以只创建一个“FriendlyOffset”属性并将其绑定到 ClipboardContentBinding。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多