2014-02-14 30 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