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

时间:2019-02-03 16:06:52

标签: c# wpf

我的C#WPF解决方案如下: 具有startupControl的主窗口(始终运行) 带有其他控件的Dialogwindow。 一个公共Helper类,其中包含一些公共静态属性,以指示客户的哪个部门处于活动状态,以及当前我关注的对象。

我只希望在Startupcontrol中显示两个XAML textBlock,以显示属性名称(如果已设置部门或客户的值)。

我认为通过某种绑定可以使它正常工作,但是除了绑定之外,我对绑定一无所知。

是否可以通过对话框窗口中的控件以任何方式更改Startupcontrol中2个文本块的值?

由于程序很小,我确切地知道值何时更改,所以我认为我可以创建一个函数来设置值ex。:

activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;

但是从DialogWindow中的control.cs中,似乎可以到达activeDepartmentTextBlock。

谁能帮助我?

2 个答案:

答案 0 :(得分:1)

从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}"/>

答案 1 :(得分:0)

Binding是一个很好的解决方案,但是您具有静态属性,因此由于没有DependencyObject(或实现INotifyPropertyChanged的对象实例),因此无法直接使用绑定基础结构来接收更新通知)。

如果值确实发生变化,并且您需要在主窗口中更新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}"/>

这似乎很困难,仅此而已。您可以改用events model并将事件添加到HelperClass中。 MainWindow可以添加事件处理程序,并在事件引发时更改activeDepartmentTextBlock的值。

public MainWindow()
{
    InitializeComponent();
    HelperClass.Instance.DepartmentChanged += OnDepartmentChanged;
}

private void OnDepartmentChanged(Department newDepartment)
{
    activeDepartmentTextBlock.Text = newDepartment.Name;
}

更新。如果您想拥有最简单的解决方案,则可以打破封装原则,并将MainWindow作为参数传递给DialogWindow,并公开activeDepartmentTextBlock。因此,您将能够在MainWindow的字段中保存到DialogWindow的链接,并在需要时仅在DialogWindow中更改文本:

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