WPF转换器,Convertback丢失数据

问题描述

我已经在以下问题上停留了一段时间,但没有找到解决方案。 我有一个WPF应用程序,其中显示了一个网格,其中每个单元格都包含一个自定义类型DoubleInputCell的对象。该对象包含其值,一个id,一个工具提示和一些其他设置

要从该对象中获取值,我们有一个转换器,如下所示:

public class DoubleCellValueConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
    {
        return (value as DoubleInputCell)?.Value;
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
        return new DoubleInputCell() { Value = double.Parse(value.ToString()),State = new ManualState() };
    }
}

这在两个方向上都能正常工作。 但是,当值更改时,我还必须从 ViewModel 内部将工具提示更改为类似于“上一个输入:xxx”。由于需要在更改选择时存储这些值,因此必须在ViewModel中进行此操作,因此网格将被其他数据填充。返回时,必须使用此工具提示而不是默认的提示。

此刻,我的XAML如下所示:

<DataTemplate x:Key="DoubleCellTemplate">
   <Grid>
      <dxe:TextEdit Name="PART_Editor" 
                    MaskType="Numeric"
                    FontSize="10"
                    DisplayFormatString="f3"
                    HorizontalContentAlignment="Right"
                    ToolTip="{Binding Value,Converter={StaticResource DoubleCellToolTipConverter}}"
                    EditValue="{Binding Value,Converter={StaticResource DoubleCellValueConverter}}"/>
     <Border x:Name="border" BorderThickness="2" />
   </Grid>
</DataTemplate>

但是现在由于转换器没有收到完整的对象,因此无法设置工具提示和其他属性,因此这些值丢失了。导致第一次更改单元格值后,总是具有空的工具提示。

我还尝试过不使用转换器,而仅在对象本身的值更改时抛出一个事件。但是,该对象再也无法进入 set 状态,因此无法引发此事件。

有人知道我如何克服这个问题吗?

编辑

这是DoubleInputCell

public class DoubleInputCell : ICell,IValue<double?>
{
    public string CellId { get; set; }
    public double? Value { get; set; }
    public IState State { get; set; } = new ManualState();
    public bool IsReadOnly { get; set; } = false;
    public string MaskType { get; set; } = "Numeric";
    public string Mask { get; set; } = "f3";
    public string ToolTip { get; set; }
}

解决方法

您将ToolTipEditValue目标属性绑定到相同的源属性...您希望将哪个属性设置为转换器返回的值?

您为什么不将ToolTip绑定到Value.ToolTip并将EditValue绑定到Value.Value

ToolTip="{Binding Value.ToolTip}"
EditValue="{Binding Value.Value}"

如果要基于ToolTip属性更改Value属性,则可以在后者的设置器中执行此操作,而无需在视图中使用转换器。

,

找到了解决此问题的正确方法。实际上,这是不言自明的,但是由于我之前曾尝试过这种方法并且没有起作用,所以我走错了方向。

我不应该使用ToolTip的转换器,而应该直接绑定到属性本身,如mm8所述。

ToolTip="{Binding Value.ToolTip}"

然后在我的模型中,当工具提示的值更改时,我应该引发OnPropertyChanged事件。

,

请在您的绑定中添加“ Mode = TwoWay,UpdateSourceTrigger = PropertyChanged”。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...