如何解决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; }
}
解决方法
您将ToolTip
和EditValue
目标属性绑定到相同的源属性...您希望将哪个属性设置为转换器返回的值?
您为什么不将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”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。