【问题标题】:Value converter change back to source值转换器更改回源
【发布时间】:2016-01-29 17:59:18
【问题描述】:

我在我的 wpf 控件中使用 xml 绑定,XMLDocument 是 ViewModel 的公开属性。代码如下:

public class ViewModel : ViewModelBase
{
    private XmlDocument _xmlDataProvider;
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            base.RaisePropertyChangedEvent("Name");
        }
    }
    public XmlDocument XmlDataProvider
    {
        get { return _xmlDataProvider; }
        set
        {
            _xmlDataProvider = value;
            base.RaisePropertyChangedEvent("XmlDataProvider");
        }
    }
}

我的 XAML 代码如下所示:

<UserControl x:Name="ctrlTemplate" x:Class= "CtrlTemplate"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WPFControl.UI"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:xckt="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"
             mc:Ignorable="d" 
             DataContext="{DynamicResource ViewModel}">
    <UserControl.Resources>
            <local:ViewModel x:Key="ViewModel" />
        </ResourceDictionary>
    </UserControl.Resources>

以下控件绑定到我的 xml 中的一个节点:

            <DatePicker DataContext="{Binding Path=XmlDataProvider}" SelectedDate="{Binding XPath=dataDocument/loan/paymentDates/paymentDate[1], Converter={StaticResource NullToDateConverter}, UpdateSourceTrigger=PropertyChanged}"/>

我在代码段中的转换器如下:

public class NullToDateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (String.IsNullOrEmpty(value.ToString()))
        {
            return DateTime.Now.Date;
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString();
    }
}

如果节点的值为空,转换器将按预期工作。它将日期时间控件的值设置为当前值。

但我面临的问题是,如果用户出于任何原因没有更改 datepicker 的值并尝试保存 xml,则 xml 中节点的值仍然为空。最好的方法是什么?

【问题讨论】:

  • 如果默认值设置为SelectedDateDatePicker 那么它对你有用吗?
  • 没有值不会传播回源。我可以为 xml 的空节点设置默认值。但这对吗?
  • 我的意思是,如果您为DependencyProperty 设置默认值SelectedDate,那么如果没有更改,那么您可以获得默认值。

标签: c# xml wpf converter xmldataprovider


【解决方案1】:

如果 WPF 认为目标的值与源的值不同,则 WPF 不会更新源。 IE。如果目标值不变。

但是,您可以通过调用 BindingExpression.UpdateSource() 方法强制 WPF 更新源。如果没有可靠地重现问题的a good, minimal, complete code example,就不可能具体说明如何将其合并到代码中。一个明显的选择是在要保存 XML 时(即之前)调用它。

可能看起来像这样:

BindingOperations
    .GetBindingExpression(datePicker1, DatePicker.SelectedDateProperty)
    .UpdateSource();

当然,这假设您将 DatePicker 控件命名为 datePicker1

这将确保无论SelectedDate 的当前值是什么,它都会被复制回绑定的原始源(即XML 中的路径)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多