WPF:绑定自定义类属性。PropertyChanged事件已触发但视图未更新。

3
我有一个自定义类Spieltag,包含属性SpieltagDaten(自定义类)。 SpieltagDaten具有称为SpieleGespielt的属性。 我已将此属性设置为文本框文本属性上绑定的目标。
绑定起作用了,因为属性的初始值被显示出来了,但是当属性更改时,文本框没有更新。
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
你确定转换器工作正常吗? - Haris Hasan
尝试在转换器内部设置断点。如果在引发属性更改时未被触发,则绑定无效。 - decyclone
是的,转换器工作正常,当设置初始值时它被调用,但在我更改模型值时它没有被调用。 - chaosr
1个回答

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
我再次遇到了这个问题,按照你建议的修改了我的代码,现在它可以正常工作了——看来去年尝试时我犯了一个错误... - chaosr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接