C# WPF转换器,Convertback丢失数据
我已经在下面的问题上停留了一段时间,没有找到解决方案。 我有一个WPF应用程序,其中显示了一个网格,其中每个单元格都包含一个自定义类型的对象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
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中手动绑定编辑器时,预计不会引发这些事件。您仍然无法将两个目标属性绑定到一个源属性而不丢失值。如果您是正确的,这种方法将永远无法正常工作。我已经发布了正确的解决方案作为答案。