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}"/>
Это может выглядеть тактрудный путь и все.Вместо этого вы можете использовать модель событий и добавить событие к вашему 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;