C# WPF转换器,Convertback丢失数据

C# WPF转换器,Convertback丢失数据,c#,wpf,datagrid,devexpress,C#,Wpf,Datagrid,Devexpress,我已经在下面的问题上停留了一段时间,没有找到解决方案。 我有一个WPF应用程序,其中显示了一个网格,其中每个单元格都包含一个自定义类型的对象DoubleInputCell。此对象包含其值、id、工具提示和其他一些设置 为了获得该对象的值,我们有一个转换器,如下所示: public class DoubleCellValueConverter : IValueConverter { public object Convert(object value, Type targetType, o

我已经在下面的问题上停留了一段时间,没有找到解决方案。 我有一个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, Type targetType, object parameter, CultureInfo culture)
    {
        return new DoubleInputCell() { Value = double.Parse(value.ToString()), State = new ManualState() };
    }
}
<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>
这在两个方向上都正常工作但是,当值发生更改时,我还必须将视图模型内部的工具提示更改为类似于“先前输入:xxx”的内容。这必须发生在ViewModel中,因为当这些值更改选择时,需要存储这些值,因此网格会被其他数据填充。返回时,必须使用此工具提示而不是默认提示

此时,我的XAML如下所示:

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, Type targetType, object parameter, CultureInfo culture)
    {
        return new DoubleInputCell() { Value = double.Parse(value.ToString()), State = new ManualState() };
    }
}
<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>

您将
工具提示
编辑值
目标属性绑定到同一个源属性…您希望将哪个属性设置为转换器返回的值

为什么不将
工具提示
绑定到
值。工具提示
编辑值
绑定到
值。值

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

如果要基于
属性更改
工具提示
属性,可以在后者的setter中执行此操作,而无需在视图中使用转换器。

已找到此问题的正确解决方案。事实上,这是不言自明的,但因为我以前尝试过这种方法,但它不起作用,所以我走错了方向

我不应该将转换器用于工具提示,而应该像mm8所说的那样直接绑定到属性本身

ToolTip="{Binding Value.ToolTip}"

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

您将
ToolTip
EditValue
目标属性绑定到同一源属性……您希望将哪些属性设置为转换器返回的值?将
工具提示
绑定到
值。工具提示
编辑值
绑定到
值。值
?直接绑定到值时,devExpress控件不会引发EditValueChanged事件(或者通常在WPF中,不能这样说)。这就是为什么我们有一个转换器,这一个取出值。如上所述,它正确显示所有数据。这只是我需要能够更新整个单元格,而不仅仅是转换器内部发生了什么?该事件应该在值实际更改时引发,不是吗?引发,我很抱歉,不,它没有。因此,由于使用'Value.Value``GridControl,DevXPress当时的答案也出现了问题。GridControl仅针对使用其本机数据绑定机制的单元格引发CellValueChanged和CellValueChanged事件。可以将EditSettings指定给列,也可以在CellTemplate中放置名为“PART_Editor”的BaseEdit子体来使用它。在CellTemplate中手动绑定编辑器时,预计不会引发这些事件。您仍然无法将两个目标属性绑定到一个源属性而不丢失值。如果您是正确的,这种方法将永远无法正常工作。我已经发布了正确的解决方案作为答案。