Ошибка привязки с PropertyChanged - объект не соответствует целевому типу - PullRequest
0 голосов
/ 03 августа 2020

У меня есть текстовое поле с двусторонней привязкой, но выдает ошибку TargetException. Данные не загружаются в TextBox, и когда я их набираю, я получаю эту ошибку:

System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=(local:Config.eventDateFormat); DataItem='String' (HashCode=-247125614); target element is 'TextBox' (Name='TXTB_Settings_Event_AddDateToName'); target property is 'Text' (type 'String') TargetException:'System.Reflection.TargetException: Object does not match target type.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
   at MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value)
   at System.Windows.Data.BindingExpression.UpdateSource(Object value)'

Вот мой XAML:

<TextBox x:Name="TXTB_Settings_Event_AddDateToName"
         Text="{Binding (local:Config.eventDateFormat), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         TextWrapping="Wrap"  Margin="110,200,1012,492"/>

Вот класс и свойство:

public class Config : INotifyPropertyChanged
{
   private string _eventDateFormat = "MMM-dd-yy-";
   public string eventDateFormat
   {
      get { return _eventDateFormat; }
      set
      {
         if (value != _eventDateFormat)
         {
            _eventDateFormat = value;
            OnPropertyChanged(nameof(eventDateFormat));
         }
      }
   }

   public event PropertyChangedEventHandler PropertyChanged;
   protected void OnPropertyChanged(string name)
   {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
         handler(this, new PropertyChangedEventArgs(name));
      }
   }
}

Я также пробовал это:

private string _eventDateFormat = "MMM-dd-yy-";
public string eventDateFormat
{
   get { return _eventDateFormat; }
   set
   {
      if (value != _eventDateFormat)
      {
         _eventDateFormat = value;
         Changed();
      }
   }
}

public event PropertyChangedEventHandler PropertyChanged;
public void Changed([CallerMemberName] string property = "") =>
   PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));

DataContext для MainWindow:

this.DataContext = this;

У меня есть куча наблюдаемых коллекций, привязанных к другие элементы пользовательского интерфейса, поэтому я не могу изменить DataContext только на Config. Я попытался выполнить привязку к сетке, в которой они находились, но не смог ее скомпилировать.

Когда мой класс Config был stati c, я смог выполнить двустороннюю привязку, не реализовав INotifyPropertyChanged. Однако из того, что я читал, этот класс не должен быть c, поскольку он иногда обновляется.

Не уверен, актуален ли он, я использую MahApps Metro 2.0

Использование c# 4.6.1

1 Ответ

1 голос
/ 03 августа 2020

Круглые скобки используются для привязки к присоединенным свойствам .

Чтобы привязать к присоединенному свойству, заключите в круглые скобки присоединенное свойство. Например, для привязки к прикрепленному свойству DockPanel.Dock используется синтаксис Path = (DockPanel.Dock).

Вам необходимо удалить круглые скобки из привязки, а также префикс пространства имен local. Предполагая, что Config является свойством, содержащим экземпляр вашего класса Config в вашей модели основного представления, путь будет выглядеть так:

Text="{Binding Config.eventDateFormat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

Если это не свойство в вашей модели основного представления, сделайте он один, если вы не можете нигде явно указать его как контекст данных. Если вы установите отдельный экземпляр в качестве контекста данных, вы просто привяжете его к eventDateFormat.

...