类到表项的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')

也许你们中有人能帮我……我试了3个小时了。

类到表项的Wpf绑定实例

你有几个问题:

  1. ManagerRoot需要使用属性

在你的代码中,ManagerRoot的UserManager和PrinterManager成员实际上是这里的字段,而不是属性。您不能绑定到字段。将它们改为属性。这是你的主要问题。

  • 引发属性更改通知
  • 也许你的实际代码以某种方式做到了这一点,而你没有展示它,但为了使绑定工作良好,你应该为绑定到的所有属性触发属性更改通知。这意味着ManagerRoot、UserManager和PrinterManager都应该为它们的属性生成属性更改通知。在您的示例中,您可能不需要它,但是如果您试图更改title属性,或者在运行时打开面板时用其他对象替换ManagerRoot, PrinterManager或UserManager,那么如果没有生成属性更改通知,更改将不会对面板生效。有很多关于理解属性更改通知的好文章,我手头没有链接,但如果你搜索有关该主题的信息,你应该会找到很多很好的参考和例子。