2015-10-29 3 views
0

J'utilise la liaison xml avec mes contrôles wpf, le XMLDocument est une propriété exposée de ViewModel. Voici le code:Retour au convertisseur de valeur

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"); 
     } 
    } 
} 

Et mon code XAML ressemble à ceci:

<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> 

Le contrôle suivant est binded à un noeud dans mon xml:

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

Mon convertisseur dans le segment de code est la suivante:

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(); 
    } 
} 

Le convertisseur fonctionne comme prévu, si la valeur du noeud est vide. Il définit la valeur du contrôle datetime sur la valeur actuelle.

Mais je suis confronté au problème, que si l'utilisateur pour une raison quelconque ne change pas la valeur de datepicker et essaie de sauvegarder le xml, la valeur du nœud dans le xml reste nulle. Quelle est la meilleure façon de le faire?

+0

Si la valeur par défaut est définie sur 'SelectedDate' de' DatePicker', cela fonctionne-t-il pour vous? –

+0

Aucune valeur ne se propage à la source. Je peux définir la valeur par défaut pour les nœuds vides de xml. Mais serait-ce juste? – Ishan070692

+0

Je veux dire vous si vous définissez la valeur par défaut pour 'DependencyProperty'' SelectedDate', donc s'il n'y a pas de changement, vous pouvez obtenir la valeur par défaut. –

Répondre

0

WPF ne mettra pas à jour la source s'il ne pense pas que la valeur de la cible est différente de celle de la source. C'est à dire. si la valeur cible ne change pas.

Vous pouvez cependant forcer WPF à mettre à jour la source en appelant la méthode BindingExpression.UpdateSource(). Sans a good, minimal, complete code example qui reproduit fidèlement le problème, il est impossible de dire précisément comment vous incorporer cela dans votre code. Une option évidente serait de l'appeler quand le XML doit être sauvegardé (c'est-à-dire juste avant).

Cela pourrait ressembler à ceci:

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

Cela suppose, bien sûr, que vous nommez votre contrôle DatePicker comme datePicker1.

Ceci garantira que, quelle que soit la valeur actuelle de SelectedDate, elle est recopiée dans la source d'origine pour la liaison (c'est-à-dire le chemin dans votre fichier XML).