2015-08-17 83 views
1

我注意到,當我的列綁定到VM中的字段時,一切正常,我按照預期正常工作。但是,由於客戶的一個奇怪的要求,我需要使用多重綁定和轉換器在另一列的狀態發生變化時返回不同的值。所以我結束了這樣的事情。無法通過具有多重綁定和轉換器的列進行排序

<DataGridTextColumn Header="Original"> 
    <DataGridTextColumn.Binding> 
    <MultiBinding Converter="{StaticResource OriginalConverter}"> 
     <Binding Path="Status.Id" /> 
     <Binding Path="Original" /> 
     <Binding Path="Substitution" /> 
    </MultiBinding> 
    </DataGridTextColumn.Binding> 
    <DataGridTextColumn.ElementStyle> 
    ... 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

我不知道如何使列進行排序。關閉轉換器不是問題,因爲它是電網的主要功能之一。我在我的數據網格組件中使用集合視圖源,如果它有任何相關性的話。轉換器本身如下所示。

public class OriginConverter : IMultiValueConverter 
{ 
    public object Convert(Object[] values, Type type, object param, CultureInfo culture) 
    { 
    int status = (int) values[0]; 
    int original = ...; 
    int substitution = ...; 
    return status < 3 ? original : substitution; 
    } 
} 

或者使用轉換器時排序不可用?這聽起來不太可能......

我發現this hint,其實際工作一點點,因爲列取得伴隨排序的列那種需要與對於顯示值三角形,即轉換器提供的那個,並且在他的例子中它被固定到一個綁定屬性。

+0

您需要將'ConvertBack()'方法添加到您的轉換器以獲取爲您的'DataGridColumn'設置的新值。然後根據它進行排序。 –

+0

@AbinMathew我如何讓網格實際調用* ConvertBack *?現在它根本不被調用。此外,我有點驚訝,轉換**返回**會是一個問題,因爲我希望得到的排序是基於**值轉換爲**的字母和我們**從**轉換的原始值。請解釋。 –

+0

當您在ViewModel中檢索值時,無需調用'ConvertBack()',則將調用'ConvertBack()'。在ConvertBack()中,你需要返回爲GridViewColumn設置的新值。所以集合將保存您的新值,並且您可以基於字母排序集合。 –

回答

1

SortMemberPath可以幫助你

<DataGridTextColumn Header="Original" SortMemberPath="SortParam"> 
    <DataGridTextColumn.Binding> 
    <MultiBinding Converter="{StaticResource OriginalConverter}"> 
     <Binding Path="Status.Id" /> 
     <Binding Path="Original" /> 
     <Binding Path="Substitution" /> 
    </MultiBinding> 
    </DataGridTextColumn.Binding> 
    <DataGridTextColumn.ElementStyle> 
    ... 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 
public int SortParam 
{ 
    get 
    { 
    return (bool)(new OriginalConverter()) 
     .Convert(new object[] { Status.Id, Original, Substitution }, typeof(int), null, null); 
    } 
} 

備註:SortMemberPath只對財產的工作,所以你最好在你的模型計算出的屬性,傷心

萬一模型自動生成( EF,nHybernate或其他OCR映射器),或者如果不允許對模型進行更改(無法訪問源代碼),程序員可以使用部分類來粘附原始模型所需的額外屬性,而不需要繼承或修改T 4個文件的轉換。

+0

沒錯。這就是關聯答案中的人所做的。它**提供了**幫助,因爲現在當我點擊一列時,我正在得到排序三角形標記。**然而,**,這是我需要解決的問題,我不需要按* Status.Id *來排序,就像你的例子。我想按**排序轉換器**返回的值,它取自*原始*取*狀態*的某些值和取*替換其他值。我想將成員路徑設置爲* OriginalConverter的*值。我怎樣才能做到這一點? –

+0

我已經用您的建議更新了您的答案。請給我幾分鐘的時間來在VS中試用它,我們很快就會得到最終版真正的代碼。 –

+0

我發現它不工作哈哈... SortMemberPath中的MultiBinding – daniel

相關問題