我的C#WPF解决方案如下: 具有startupControl的主窗口(始终运行) 带有其他控件的Dialogwindow。 一个公共Helper类,其中包含一些公共静态属性,以指示客户的哪个部门处于活动状态,以及当前我关注的对象。
我只希望在Startupcontrol中显示两个XAML textBlock,以显示属性名称(如果已设置部门或客户的值)。
我认为通过某种绑定可以使它正常工作,但是除了绑定之外,我对绑定一无所知。
是否可以通过对话框窗口中的控件以任何方式更改Startupcontrol中2个文本块的值?
由于程序很小,我确切地知道值何时更改,所以我认为我可以创建一个函数来设置值ex。:
activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;
但是从DialogWindow中的control.cs中,似乎可以到达activeDepartmentTextBlock。
谁能帮助我?
答案 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;