Wpf将类的实例绑定到tabitem

时间:2015-10-01 11:53:34

标签: c# wpf xaml

我想将Property Title绑定到我的tabitem header。我的架构看起来像这样:

Image

在我的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>

我的MainWindow.xaml.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;
    }
}
}

My 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个小时。

1 个答案:

答案 0 :(得分:1)

你有几个问题:

  1. ManagerRoot需要使用属性
  2. 在您的代码中,ManagerRoot的UserManager和PrinterManager成员实际上是字段,而不是属性。您无法绑定到字段。将它们更改为属性。这是你的主要问题。

    1. 提出房产更改通知
    2. 也许您的真实代码以某种方式执行此操作并且您尚未显示它,但为了使绑定工作正常,您应该触发绑定到的所有属性的属性更改通知。这意味着ManagerRoot,UserManager和PrinterManager都应为其属性生成属性更改通知。在您的示例中,您可能无法使用它,但如果您曾尝试更改title属性,或者在面板打开时将ManagerRoot,PrinterManager或UserManager替换为运行时的其他对象,则更改将不会生效在您的面板上没有生成属性更改通知。有很多关于理解房产变更通知的好文章,而且我手边没有链接,但如果你搜索有关该主题的信息,你应该找到很多好的参考资料和实例