2014-02-14 58 views
1

當您拖動滑塊時,會得到一個ConvertBack(預計),但爲什麼然後我會直接得到一個「Convert」?我只希望Convert在第一次初始化時被調用,或者如果它正在引發屬性更改通知,但它不會。WPF循環轉換器

<Window x:Class="WpfApplication10.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:l="clr-namespace:WpfApplication10" 
     Title="MainWindow"> 
    <Slider Value="{Binding Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter={l:Converter}}"/> 
</Window> 


public class Converter : MarkupExtension, IValueConverter 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 
} 

public partial class MainWindow : Window 
{ 
    public double Value { get; set; } 

    public MainWindow() 
    { 
     DataContext = this; 
     InitializeComponent(); 
    } 
} 

回答

3

這是可能發生的,因爲你使用.NET 4,改變綁定的方式工作,一點點:http://karlshifflett.wordpress.com/2009/05/27/wpf-4-0-data-binding-change-great-feature/

前4綁定無法更新而回(假定它不需要),新的行爲默認是這樣做的。理由在鏈接的博客中解釋。

編輯:我想我應該問是否有一個原因,你不希望它轉回來,或者如果它只是好奇心?如果您需要防止在轉換回來,最清晰的策略可能是保持你上次轉換價值的軌道鸚鵡回:

public class Converter : MarkupExtension, IValueConverter 
{ 
public override object ProvideValue(IServiceProvider serviceProvider) 
{ 
    return this; 
} 

public object lastValue; 

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    return lastValue; 
} 

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    lastValue = value; 
    return value; 
} 
} 

還有設置綁定到OneWayToSource的選項,這將阻止它設置回到滑塊值......假設您不需要將數據推回到滑塊。

+0

+1爲好鏈接和答案。 – Sheridan

+0

這出現在4.5中用3.5編寫的代碼中。在少數情況下,傳入Convert/ConvertBack的值不完全相同(例如數字類型的精度損失),並且會導致奇怪的行爲。如果你可以選擇退出新的行爲,那將會很好。 – pastillman

+0

這有點令人驚訝,我不會指望這種行爲是愚蠢的 - 你的意思是浮點數/雙精度的精度很奇怪嗎? float/double是單向的1.5和1.499999999是正常的,這是避免使用它們的一個原因,除非你的意思是。如果是這樣的話,你有沒有考慮使用小數? – ianschol