类到表项的Wpf绑定实例
本文关键字:Wpf 绑定 实例 | 更新日期: 2023-09-27 18:15:33
我想将属性Title
绑定到我的tabitem header
。我的架构是这样的:
在我的mainwindow.xaml
文件中,我有这个代码:
<Controls:MetroWindow x:Class="ConfigManager.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
Title="ConfigManager">
<DockPanel>
<TabControl Controls:TabControlHelper.IsUnderlined="True">
<TabItem DataContext="{Binding UserManager}" Header="{Binding Title}"">
</TabItem>
<TabItem DataContext="{Binding PrinterManager}" Header="{Binding Title}">
</TabItem>
<TabItem Header="TabItem">
</TabItem>
</TabControl>
</DockPanel>
</Controls:MetroWindow>
My mainwindow . example .cs:
namespace ConfigManager
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : MetroWindow
{
public ManagerRoot ManagerRoot { get; set; }
public MainWindow()
{
InitializeComponent();
ManagerRoot = new ManagerRoot();
DataContext = ManagerRoot;
}
}
}
我ManagerRoot :
namespace ConfigManager
{
[Serializable]
public class ManagerRoot
{
[XmlElement("UserManager")]
public UserManager UserManager = new UserManager();
[XmlElement("PrinterManager")]
public PrinterManager PrinterManager = new PrinterManager();
}
}
我的UserManager(与PrinterManager相同):
[XmlIgnore]
private string _title = "User";
[XmlAttribute("Title")]
public string Title
{
get { return this._title; }
set { this._title = value; }
}
这就是我得到的错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'Title' property not found on 'object' ''ManagerRoot' (HashCode=20501377)'. BindingExpression:Path=Title; DataItem='ManagerRoot' (HashCode=20501377); target element is 'TabItem' (Name=''); target property is 'Header' (type 'Object')
System.Windows.Data Error: 40 : BindingExpression path error: 'UserManager' property not found on 'object' ''ManagerRoot' (HashCode=20501377)'. BindingExpression:Path=UserManager; DataItem='ManagerRoot' (HashCode=20501377); target element is 'TabItem' (Name=''); target property is 'DataContext' (type 'Object')
你有几个问题:
- ManagerRoot需要使用属性
在你的代码中,ManagerRoot的UserManager和PrinterManager成员实际上是这里的字段,而不是属性。您不能绑定到字段。将它们改为属性。这是你的主要问题。
- 引发属性更改通知
也许你的实际代码以某种方式做到了这一点,而你没有展示它,但为了使绑定工作良好,你应该为绑定到的所有属性触发属性更改通知。这意味着ManagerRoot、UserManager和PrinterManager都应该为它们的属性生成属性更改通知。在您的示例中,您可能不需要它,但是如果您试图更改title属性,或者在运行时打开面板时用其他对象替换ManagerRoot, PrinterManager或UserManager,那么如果没有生成属性更改通知,更改将不会对面板生效。有很多关于理解属性更改通知的好文章,我手头没有链接,但如果你搜索有关该主题的信息,你应该会找到很多很好的参考和例子。