2011-05-16 56 views
3

我有一个自定义类Spieltag包含一个属性SpieltagDaten(自定义类)。 SPieltagDaten拥有一个名为SpieleGespielt的房产。我已经将此属性设置为文本框文本属性的绑定目标。WPF:绑定到自定义类的属性。 PropertyChanged被解雇但视图不更新

该绑定工作得很好,因为该属性的初始值是beeing显示,但当属性更改文本框不beeing更新。

PropertyChanged事件被触发并且参数拼写正确。

这是代码的样子:

这是绑定文本框:

<TextBlock Name="textBlockGespielt" 
    Text="{Binding Path=MySpieltag.Daten, 
      Converter={util:SpieltagDatenToStringConverter}, 
      ConverterParameter=SpieleGespielt, 
      UpdateSourceTrigger=PropertyChanged}" /> 

在我设置

this.DataContext = this; 

这个窗口的构造函数是根类包含名为Daten的属性的模型:

public class Spieltag : ModelBase { 

    private ISpieltagDaten daten; 

    public ISpieltagDaten Daten 
    { 
     get { return daten; } 
     set { daten = value; Changed("Daten"); } 
    } 
} 

SpieltagDaten包含属性SpieleGespielt

public class SpieltagDaten : ModelBase, interfaces.ISpieltagDaten 
{ 
    private int _spieleGespielt; 

    public Int32 SpieleGespielt 
    { 
     get { return _spieleGespielt; } 
     set { _spieleGespielt = value; Changed("SpieleGespielt"); } 
    } 
} 

模型库实现INotifyPropertyChanged:

public class ModelBase: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    protected void Changed(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

编辑:

我忘了发布器。它是从派生的MarkupExtension所以我可以用它在XAML简单:

class SpieltagDatenToStringConverter : MarkupExtension, IValueConverter 
{ 
    private static SpieltagDatenToStringConverter _converter = null; 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (_converter == null) 
     { 
      _converter = new SpieltagDatenToStringConverter(); 
     } 
     return _converter; 
    } 

    public object Convert(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     ISpieltagDaten daten = (ISpieltagDaten)value; 

     string res = String.Empty; 

     string propertyName = parameter.ToString(); 


      PropertyInfo pi = typeof(ISpieltagDaten).GetProperty(propertyName); 

      if (pi != null) 
      { 
       res = pi.GetValue(daten,null).ToString(); 
      } 

     return res; 
    } 


    public object ConvertBack(object values, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

该转换器beeing呼吁模型的初始设置。 enter image description here

+1

你确定转换器工作正常? – 2011-05-16 16:20:33

+0

尝试在该转换器中放置一个断点。如果在提高属性更改时未命中,则绑定不起作用。 – decyclone 2011-05-16 17:02:53

+0

是的,转换器工作正常,它在初始值被设置但是当我改变模型值时不被调用时被调用。 – chaosr 2011-05-17 14:38:34

回答

2

您的转换器没有正确指定。在UserControl.Resources指定您的转换器类的实例,然后引用该实例在您的TextBlock

<UserControl.Resources> 
    <util:SpieltagDatenToStringConverter x:Key="mySpieltagDatenToStringConverter" /> 
</UserControl.Resources> 

<TextBlock Name="textBlockGespielt" 
    Text="{Binding Path=MySpieltag.Daten, 
      Converter={StaticResource mySpieltagDatenToStringConverter}, 
      ConverterParameter=SpieleGespielt, 
      UpdateSourceTrigger=PropertyChanged}" /> 
+1

对不起,我忘了发布转换器。我编辑了我的帖子。转换器是从MarkupExtension派生的,并且在模型中设置了初始值并且视图更新成功时调用该转换器。但是当我改变模型值时,它不会再被调用。 – chaosr 2011-05-17 14:36:41

+0

我再次遇到了这个问题,并将我的代码更改为您所建议的代码,并且它的工作原理 - 似乎去年尝试时出现错误... – chaosr 2012-01-11 13:52:29