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; }
    }

ユーザー コントロール コード ビハインドの 1 つで、CaseDetails のオブジェクトを作成し、App クラスに設定します。

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

また、App クラスの CaseDetails オブジェクトが更新されます。

私の MainWindow.xml には、CaseDetails の CaseName プロパティにバインドされた TextBlock があります。この 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 poperty が更新されないのはなぜですか?? バインディングのどこが間違っていますか??

4

1 に答える 1

3

CaseDetailsINotifyPropertyChanged を実装していない App クラスでプロパティを設定しているため、バインディングは更新されません。

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 に答える