Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 循环转换器_Wpf_Converter - Fatal编程技术网

Wpf 循环转换器

Wpf 循环转换器,wpf,converter,Wpf,Converter,当你拖动滑块时,你会得到一个ConvertBack(预期),但是为什么我会在那之后直接得到一个“Convert”?我只希望在Convert第一次初始化时调用它,或者在它发出属性更改通知时调用它,但是它没有 <Window x:Class="WpfApplication10.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://

当你拖动滑块时,你会得到一个ConvertBack(预期),但是为什么我会在那之后直接得到一个“Convert”?我只希望在Convert第一次初始化时调用它,或者在它发出属性更改通知时调用它,但是它没有

<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();
    }
}

公共类转换器:MarkupExtension、IValueConverter
{
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
{
归还这个;
}
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值;
}
}
公共部分类主窗口:窗口
{
公共双值{get;set;}
公共主窗口()
{
DataContext=this;
初始化组件();
}
}

这可能是因为您使用的是.NET 4,它稍微改变了绑定的工作方式:

而在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,这将防止它设置回滑块值。。。假设您不需要将数据推回到滑块。

这在3.5版和4.5版编写的构建代码中出现。在少数情况下,传递到Convert/ConvertBack中的值不完全相同(例如,数字类型中的精度损失)并导致奇数行为。如果你可以选择不使用新的行为,那就太好了。这有点令人惊讶,我不认为这种行为是愚蠢的-你是说精度对于浮动/双精度来说很奇怪吗?float/double单程为1.5,另一程为1.499999999是正常的,这是避免使用它们的一个原因,除非你真的想这样做。如果是这样的话,您考虑过使用十进制吗?目前我只是在ConvertBack中缓存“值”,类似于您的建议。十进制是另一种选择,但会破坏很多现有代码,所以缓存黑客现在就可以了。我们在内部使用一堆浮点,这在执行几何计算时是一个巨大的麻烦。我建议编写这样的方法:
private const float EPSILON=0.0001f;private bool NearlyEqual(float-leftValue,float-rightValue,float-epsilon=epsilon){return math.Abs(leftValue-rightValue)
确保将epsilon调整到一个能够捕获计算不准确度的值,它通常比我的示例小得多。