WPF:绑定到自定义类属性。 PropertyChanged被触发,但视图不会更新

时间:2011-05-16 16:18:10

标签: c# wpf inotifypropertychanged

我有一个自定义类Spieltag,其中包含SpieltagDaten属性(自定义类)。 SPieltagDaten有一个名为SpieleGespielt的房产。我已将此属性设置为textbox text-property上绑定的目标。

绑定工作正常,因为显示了属性的初始值,但是当属性更改时,文本框不会更新。

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

ModelBase实现了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();
    }
}

在初始设置模型时调用转换器。 enter image description here

1 个答案:

答案 0 :(得分: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}" />