Wpf Привязка TextBlock к члену свойства приложения

В моем приложении 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 и устанавливаю в классе приложения

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

И объект CaseDetails класса App обновляется.

В моем MainWindow.xml у меня есть TextBlock, который привязан к свойству CaseName в CaseDetails. Этот текстовый блок не обновляется. Код 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 не обновляется ?? Где я ошибаюсь в привязке ??


person Tvd    schedule 19.09.2013    source источник


Ответы (1)


Привязка не обновляется, поскольку вы устанавливаете свойство CaseDetails в своем классе App, который не реализует INotifyPropertyChanged.

Либо вы также реализуете INotifyPropertyChanged в своем классе App, либо просто устанавливаете свойства существующего экземпляра 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; }
    }
}
person Clemens    schedule 19.09.2013
comment
Я попытался сделать CaseDetails доступным только для чтения и работать таким образом, но это не имело значения. Наконец, я попытался реализовать INotifyPropertyChanged в классе App, и это внесло изменения в привязку. Спасибо - person Tvd; 19.09.2013