2011-05-16 53 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