1

在我的 WPF 应用程序中,我希望全局使用一个对象“CaseDetails”,即所有窗口和用户控件。CaseDetails 实现 INotifyPropertyChanged,并具有属性 CaseName。

public class CaseDetails : INotifyPropertyChanged
{
    private string caseName, path, outputPath, inputPath;

    public CaseDetails()
    {
    }

    public string CaseName
    {
        get { return caseName; }
        set
        {
            if (caseName != value)
            {
                caseName = value;
                SetPaths();
                OnPropertyChanged("CaseName");
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

在我的 App.xaml.cs 中,我创建了一个 CaseDetails 对象

public partial class App : Application
{
    private CaseDetails caseDetails;

    public CaseDetails CaseDetails
    {
        get { return this.caseDetails; }
        set { this.caseDetails = value; }
    }

在我的用户控制代码之一中,我创建了 CaseDetails 的对象并在 App 类中设置

(Application.Current as App).CaseDetails = caseDetails;

并且更新了 App 类的 CaseDetails 对象。

在我的 MainWindow.xml 中,我有一个绑定到 CaseDetails 的 CaseName 属性的 TextBlock。此文本块不会更新。xml代码是:

<TextBlock Name="caseNameTxt" Margin="0, 50, 0, 0" FontWeight="Black" TextAlignment="Left" Width="170" Text="{Binding Path=CaseDetails.CaseName, Source={x:Static Application.Current} }"/>

为什么这个 TextBlock Text 属性没有更新?我在 Binding 中哪里出错了?

4

1 回答 1

3

绑定未更新,因为您CaseDetails在 App 类中设置属性,该类未实现 INotifyPropertyChanged。

您也可以在 App 类中实现 INotifyPropertyChanged,或者您只需设置现有 CaseDetails 实例的属性:

(Application.Current as App).CaseDetails.CaseName = caseDetails.CaseName;
...

然后该CaseDetails属性可能是只读的:

public partial class App : Application
{
    private readonly CaseDetails caseDetails = new CaseDetails();

    public CaseDetails CaseDetails
    {
        get { return caseDetails; }
    }
}
于 2013-09-19T08:00:58.427 回答