C# 使用其他类的公共属性值更新XAML TextBlock

C# 使用其他类的公共属性值更新XAML TextBlock,c#,wpf,C#,Wpf,我的C#WPF解决方案中包含以下内容: 带有启动控件的主窗口(始终运行) 具有不同其他控件的对话框窗口。 一个公共助手类,包含一些公共静态属性,用于指示客户的哪个部门处于活动状态,以及我目前关注的对象 我只想在Startupcontrol中显示两个XAML文本块,以便在设置部门或客户的值时显示属性名称 我认为它可以通过某种绑定顺利工作,但我对绑定一无所知,除了它们的存在 是否可以通过dialogwindow中的控件以任何方式更改Startupcontrol中2个文本块的值 由于程序很小,而且我确

我的C#WPF解决方案中包含以下内容: 带有启动控件的主窗口(始终运行) 具有不同其他控件的对话框窗口。 一个公共助手类,包含一些公共静态属性,用于指示客户的哪个部门处于活动状态,以及我目前关注的对象

我只想在Startupcontrol中显示两个XAML文本块,以便在设置部门或客户的值时显示属性名称

我认为它可以通过某种绑定顺利工作,但我对绑定一无所知,除了它们的存在

是否可以通过dialogwindow中的控件以任何方式更改Startupcontrol中2个文本块的值

由于程序很小,而且我确切地知道值何时变化,我想我可以制作一个函数来设置值,例如:

activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;
但是从对话框窗口中的my control.cs,似乎可以访问activeDepartmentTextBlock


有人能帮我吗

是一个很好的解决方案,但是您有静态属性,所以您不能直接使用绑定基础结构来获得更新通知,因为不涉及(或实现的对象实例)

如果该值确实发生了更改,并且需要在主窗口中更新
TextBlock
的值,那么您可以创建一个单例类而不是静态类来包含该值并绑定到该值

单例的一个例子:

public class HelperClass : DependencyObject {
    public static readonly DependencyProperty ActiveDepartmentProperty =
        DependencyProperty.Register( "ActiveDepartment", typeof( Department ),
        typeof( HelperClass ), new UIPropertyMetadata( "" ) );
    public Department ActiveDepartment {
        get { return (Department) GetValue( ActiveDepartmentProperty ); }
        set { SetValue( ActiveDepartmentProperty, value ); }
    }

    public static HelperClass Instance { get; private set; }

    static HelperClass() {
        Instance = new HelperClass();
    }
}
因此,绑定的工作方式如下例所示:

<TextBox Text="{Binding Source={x:Static local:HelperClass.Instance}, Path=ActiveDepartment.Name}"/>
更新。如果您想获得最简单的解决方案,可以打破封装原则,将
MainWindow
作为参数传递给
DialogWindow
,并将
activeDepartmentTextBlock
公开。因此,您可以在
对话框窗口
的字段中保存指向
主窗口
的链接,并在需要时在
对话框窗口
中更改文本:

this.mainWindow.activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;

由于WPF 4.5,使用属性更改通知绑定到静态属性非常简单

下面的示例假定您希望通知HelperClass的
ActiveDepartment
属性的更改(而不是Department对象的
Name
属性)。除了静态属性之外,声明一个名为
StaticPropertyChanged
的静态事件,并在静态属性更改时激发它:

public class Department
{
    public string Name { get; set; }
}

public class HelperClass
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    private static Department activeDepartment;

    public static Department ActiveDepartment
    {
        get => activeDepartment;
        set
        {
            activeDepartment = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(ActiveDepartment)));
        }
    }
}
可以像这样绑定到静态属性:

<TextBlock Text="{Binding Path=(local:HelperClass.ActiveDepartment).Name}"/>


不幸的是,它目前看起来有点太复杂了。我希望有一个与usercontrol交互的快捷方式。类似于:this.Usercontrol.ParentControl.ActiveDepartmentTextBlock=Helper.ActiveDepartment.Name;无论如何,谢谢你快速而仔细的回答…@Allan我正在尝试添加另一个简单的解决方案。您的示例将不起作用,因为dialogWindow不是主窗口的可视树的一部分。“您不能直接使用绑定基础结构获得通知”是错误的。自WPF 4.5以来。还有StaticPropertyChanged事件,还有一个新的静态属性绑定路径语法。我试过了,但是在StartupControl的XAML中出现了一些关于名称空间的问题,所以我现在就把它放在这里,当我再次获得som空闲时间时,我将阅读bindingstuff。谢谢你迄今为止的帮助!
<TextBlock Text="{Binding Path=(local:HelperClass.ActiveDepartment).Name}"/>