1

我有一个名为的类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" />

定位器类包括:

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

    public static GameContainer Container { get; set; }
}

游戏容器包括:

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

    public Date Date { get; set; }
}

我也尝试过使用 IOC 容器,但没有成功。

程序启动后,一切正常;单击按钮会增加日期(并调用RaisePropertyChangedDateString。但是,如果我创建容器的新实例或 的新实例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)”需要对象引用

4

1 回答 1

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);
        }
     }
   }       
}
于 2013-11-06T19:46:21.827 回答