2014-01-15 2 views
2

에 나는이 같은 DataGridComboBoxColumn 있습니다바인드 ClipboardContentBinding는 DisplayMemberPath

ElementStyle이 같은 ComboboxPairs의 목록에 결합
<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> 

:

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

이렇게하면 콤보 상자에 유용한 이름을 표시 할 수 있지만 float를 t에 바인딩 할 수 있습니다 사용자가 값을 선택할 때 viewmodel. 그러나 행을 선택하여 복사하면 부동 소수점 값이 반환됩니다. 나는 도움이되는 이름을 얻고 싶다. DataGridComboBoxColumn의 ClipboardContentBinding을 해당 DisplayMemberPath에 바인딩하는 방법이 있습니까? 아니면이 방법이 잘못 되었습니까? 어떻게 그럴 수 있니?

답변

2

당신은 CopyingCellClipboardContent event을들을 수 있습니다 : 당신이 DataGridComboBoxColumn 클래스를 서브 클래 싱하려면

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

또는, 당신은 무시할 수 :

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

핸들러는이 같은 것 그 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은 셀에 바인딩 된 float 대신 datagrid 행에 바인딩 된 항목으로 밝혀졌습니다. 그러나 그것은 내가 "FriendlyOffset"속성을 만들고 ClipboardContentBinding에 바인딩 할 수 있다는 것을 깨닫게했습니다. 감사 :) – ConditionRacer