2015-11-01 26 views
0

我有一個組合框標記如下。如何通過抵消它將組合框綁定到實際值以外的值?

<ComboBox SelectedIndex="{Binding Path=Bonkey}"> 
    <ComboBoxItem Content="Monkey" /> 
    <ComboBoxItem Content="Donkey" /> 
</ComboBox> 

我結合到具有Bonkey字段類型爲整數對象,根據下面的聲明。

class Thingy 
{ 
    public int Bonkey {get; set; } 
    ... 
} 

雖然它的偉大工程和假設,有一個編程技術問題讓我徹夜難眠。在手動標記中生成的索引是0和1.但是,我知道整數的值將是1和2.(即猴子與組合框項目相關時索引爲0,但它是組合框項目中的實際值用作數據源的對象是1.類似地,Monkey在組合框的項目中具有索引1,但它對應於對象中的2)。

我的中間解決方案是在構造函數中立即敲掉1設置數據上下文,然後在處理視圖時加1。它的工作,但我不能真正引以自豪,可以這麼說。

public SomeDialog(Thingy thingy) 
{ 
    InitializeComponent(); 
    thingy.Bonkey--; 
    DataContext = thingy; 
} 
... 
private void Cancel_Click(object sender, RoutedEventArgs eventArgs) 
{ 
    DialogResult = false; 
    DataContext.Bonkey++; 
    Close(); 
} 
... 
private void Submit_Click(object sender, RoutedEventArgs eventArgs) 
{ 
    DataContext.Bonkey++; 
    ... 
} 

我該怎麼做更多,好...不恥?

  1. 我找不到任何屬性來顯式設置組合框中項目的索引。
  2. 我試過使用轉換器,但不知何故,我要麼在組合框(沒有預先選擇)或一些奇怪的錯誤消息告訴我,我做了一個噓聲(因爲我甚至不知道如果這是一個好方法,我會放手)。
  3. 谷歌搜索給出了一堆結果,沒有一個給我清晰的如何抵消價值的界限(雖然說實話,我懷疑我可能會用太怪異的關鍵詞,因爲看起來這樣的問題一定是'以前討論過)。
+0

創建自定義的'IValueConverter',可以通過靜態值在兩個方向上偏移值,比如在'ConverterParameter'中傳遞 – dkozl

+0

@dkozl所以,基本上,選項#2?我想我可以再試一次。這可能是我的大腦越來越疲憊,我的精神過早放棄。您可能希望將其作爲回覆發佈,以便我可以接受它作爲答案,如果我能夠使用它。 –

+0

它應該適用於轉換器。也許如果你會發布你的轉換器,我們將能夠告訴你什麼是錯的 – dkozl

回答

1

有一些問題涉及偏移量和IValueConverter實現。但瀏覽他們,我沒有看到一個解決與偏移量綁定的具體情況;許多問題都涉及到已經有轉換器工作但有其他問題的人,而其他人涉及的方案卻比這個方案更復雜。

所以,這是一個非常簡單的偏移轉換器實現:

class OffsetValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int offset = int.Parse((string)parameter); 

     return (int)value - offset; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int offset = int.Parse((string)parameter); 

     return (int)value + offset; 
    } 
} 

像這樣來使用:

<ComboBox SelectedIndex="{Binding OffsetValue, 
          Converter={StaticResource offsetValueConverter1}, 
          ConverterParameter=1}"/> 

其中,當然,你必須聲明,藉此讓該轉換器的實例的資源,例如:

<Window.Resources> 
    <l:OffsetValueConverter x:Key="offsetValueConverter1"/> 
</Window.Resources> 

還有其他的選擇來實現,比如給轉換器實例本身設置一個屬性來設置偏移量的控制,或者將偏移量指定爲一個實際的值,所以不需要進行分析,但是這些方法有其自身的侷限性,例如不能重複使用它們實例用於不同的偏移量,或者分別需要XAML中更詳細的聲明。我認爲上述方法在便利性和效率之間取得了很好的平衡。


參見相關的問題:
How can I bind one property to another property, offset by a specific amount?
Applying transforms from DataTemplates in WPF

There are others,但這些似乎是最密切相關的自己的方案。

+0

這是一個很棒的答案。示例代碼爲+1。哎呀,如果我能想到爲什麼我沒有自己的工作,但我現在不在乎。它按照你的規格工作,所以我很高興作爲一個黃瓜。 –

相關問題