【问题标题】:WPF: binding to custom class property. PropertyChanged is fired but view does not updateWPF:绑定到自定义类属性。 PropertyChanged 被触发但视图不更新
【发布时间】:2011-05-16 16:18:10
【问题描述】:

我有一个自定义类 Spieltag,其中包含一个属性 SpieltagDatan(自定义类)。 SPieltagDatan 有一个名为 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();
    }
}

在模型的初始设置中调用转换器。

【问题讨论】:

  • 你确定转换器工作正常吗?
  • 尝试在该转换器中放置一个断点。如果在引发属性更改时未命中,则绑定不起作用。
  • 是的,转换器工作正常,在设置初始值时调用它,但在我更改模型值时不调用它。

标签: c# wpf inotifypropertychanged


【解决方案1】:

您的转换器未正确指定。在 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}" />

【讨论】:

  • 抱歉,我忘记发布转换器了。我已经编辑了我的帖子。该转换器是从 MarkupExtension 派生的,当在模型中设置初始值并且视图更新成功时调用它。但是当我更改模型值时,它不会再次被调用。
  • 我再次遇到了这个问题,并将我的代码更改为您建议的代码并且它可以工作 - 似乎我去年尝试时犯了一个错误......
猜你喜欢
  • 2015-08-11
  • 2015-05-22
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2020-09-21
  • 1970-01-01
  • 2012-07-30
相关资源
最近更新 更多