对象破坏绑定的新实例

时间:2013-11-06 19:07:07

标签: c# wpf xaml

我有一个名为Date的类,它会覆盖其ToString并通过属性返回它:

public string DateString
{
    get { return ToString(); }
}

我的Date实例保存在容器类中并从那里进行操作。在XAML中,重写的ToString显示如下:

<TextBlock Text="{Binding Container.Date.DateString, Source={StaticResource Locator}}" />

定位器在App.xaml中定义:

<data:Locator x:Key="Locator" />

Locator类包括:

public class Locator
{
    static Locator()
    {
        Container = new GameContainer();
    }

    public static GameContainer Container { get; set; }
}

GameContainer包括:

public class GameContainer
{
    public GameContainer()
    {
        Date = new Date();
    }

    public Date Date { get; set; }
}

我也尝试过使用IOC容器而没有运气。

当程序启动时,一切都运行正常;按钮单击会增加日期(并在RaisePropertyChanged上调用DateString)。但是,如果我创建容器的新实例或Date的新实例,则UI不再更新,我无法弄清楚原因。它似乎只发生在用户交互发生之后;我可以在程序初始化的各个阶段创建一个新实例而不会出现任何问题,但是一旦单击按钮导致创建一个新实例,该字符串就不再更新。

我已经尝试了所有我能想到的东西,但我似乎无法弄清楚导致这种情况发生的原因。任何帮助将不胜感激。

更新:目前我的依赖属性如下:

public static readonly DependencyProperty ContainerProperty =
        DependencyProperty.Register("Container", typeof(GameContainer), typeof(Locator));

    public static GameContainer Container
    {
        get { return (GameContainer)GetValue(ContainerProperty); }
        set
        {
            SetValue(ContainerProperty, value);
        }
    }

我收到此错误:非静态字段,方法或属性'System.Windows.DependencyObject.GetValue(System.Windows.DependencyProperty)'

需要对象引用

1 个答案:

答案 0 :(得分:2)

看起来您没有任何属性更改通知机制,这对于Binding正常工作非常重要。尝试实施INotifyPropertyChanged或创建相应的DependencyProperty,我将介绍在这种情况下使用DependencyProperty

public class GameContainer : DependencyObject {
  public GameContainer() {
     Date = new Date();
  }
  public static readonly DependencyProperty DateProperty = 
       DependencyProperty.Register("Date", typeof(Date), typeof(GameContainer));
  public Date Date {
     get { return (Date) GetValue(DateProperty);}
     set {
        SetValue(DateProperty, value);
     }
  }
}

注意:对班级Container中的媒体资源Locator执行相同操作。

我真的很困惑Binding如何处理静态属性。这就是我能想到的一个应该尝试的代码:

public class Locator {       
   static Locator() {
    Container = new GameContainer();
   }
   public static event EventHandler ContainerChanged;
   static GameContainer container;
   public static GameContainer Container {
     get { return container;}
     set {
        if(container != value){
          container = value;
          var handler = ContainerChanged;
          handler(null, EventArgs.Empty);
        }
     }
   }       
}