2014-11-24 39 views
0

我試圖編寫一個具有三個相關屬性的控件:value,minimum和maximum。價值變化,但最小值和最大值是固定的。帶多個參數的ValueConverter

所以我寫了一個IMultiValueConverter:

public class AngleMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double value = (double)values[0]; 
     double minimum = (double)values[1]; 
     double maximum = (double)values[2]; 

     double angle = -150.0 + ((value - minimum) * 300.0/(maximum - minimum)); 
     return angle; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

的XAML如下所示(這是一個自定義的控制,因此的RelativeSource東西):

<RotateTransform.Angle> 
    <MultiBinding Converter="{StaticResource angleMultiConverter}"> 
     <Binding Path="Value" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}"/> 
     <Binding Path="MinimumValue" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}" Mode="OneWay"/> 
     <Binding Path="MaximumValue" RelativeSource="{RelativeSource AncestorType={x:Type local:KnobControl}}" Mode="OneWay"/> 
    </MultiBinding> 
</RotateTransform.Angle> 

這工作正常,但對於ConvertBack ?我必須傳回三個值......但我只有一個?另外兩個是常量,那麼我怎麼知道它們是什麼?

我的另一個解決方案是創建一個稱爲Angle的依賴性屬性,它可以完成自定義控件中的所有工作......但是揭示了Angle,這看起來是錯誤的。

+0

除非您使用雙向綁定,否則不需要實現convertback。對於該轉換器的每次調用,最小/最大值總是相同的? – ndonohoe 2014-11-24 14:07:37

+0

我想知道爲什麼你需要一個ConvertBack方法? 假設我有一個號碼,例如10.0。從只看到數字是不可能猜測這個數字在裏面的範圍的最小值和最大值(但這是你的ConvertBack方法必須做的)。 – pgenfer 2014-11-24 14:09:58

+1

只需使用'ConverterParameter'來傳入你的兩個缺失值。 – Sheridan 2014-11-24 14:22:14

回答

0

我發現的唯一的答案是創建一個名爲Angle屬性,讓該做的工作,因爲我原來在我的提問時指出,和bonyjoe總結。

0

如果您的最小值和最大值不會改變,那麼您可以將它們作爲Converter的屬性並使用正常的IValueConverter進行轉換,然後您只綁定一個值。

你可以,如果你要綁定這些屬性有可能使用的DependencyObject作爲轉換器的基類,並創建最小值和最大值,像這樣

<UserControl.Resources> 
    <utils:AngleConverter Min="20" Max="2000" x:Key="angleConverter"/> 
</UserControl.Resources> 

在創建時將值傳遞給轉換器依賴屬性而不是標準的特性,儘管我從來沒有試過這種

自定義控件實現

在構造函數中

this.Resources.Add("AngleConverter", new AngleConverter() { Min = _min, Max = _max }); 

在最小值/最大值改變

((AngleConverter)this.Resources["AngleConverter"]).Min = newMin; 
((AngleConverter)this.Resources["AngleConverter"]).Max = newMax; 
+0

儘管對於自定義控件不起作用,但由於控制模板使用了轉換器。一切都會有相同的最小/最大;我想讓轉換器參考當前控件的最小/最大值。 – imekon 2014-11-24 16:36:19

+0

您可以在設置Min和Max後以編程方式創建資源? – ndonohoe 2014-11-24 16:37:12

+0

我已經添加了代碼,以編程方式將其執行到我的答案 – ndonohoe 2014-11-24 16:57:41