C# WPF选项卡控件数据绑定到另一个类
我正在使用我的第一个Wpf项目,更具体地说。我在一个小测试项目上测试了它。它工作得很好,直到我尝试将代码合并到我的项目中 下面是我的代码隐藏示例:C# WPF选项卡控件数据绑定到另一个类,c#,wpf,xaml,data-binding,mahapps.metro,C#,Wpf,Xaml,Data Binding,Mahapps.metro,我正在使用我的第一个Wpf项目,更具体地说。我在一个小测试项目上测试了它。它工作得很好,直到我尝试将代码合并到我的项目中 下面是我的代码隐藏示例: public class Datas { public ObservableCollection<string> titles { get; set; } public Datas() { init(); } public void init() { ti
public class Datas
{
public ObservableCollection<string> titles { get; set; }
public Datas()
{
init();
}
public void init()
{
titles = new ObservableCollection<string>()
{
"Title 1",
"Title 2",
"Title 3",
"Title 4"
};
}
}
public partial class Window1 : MetroWindow
{
private Datas datas;
public Window1()
{
init();
}
private void init()
{
datas = new Datas();
this.DataContext = this;
}
}
公共类数据
{
公共可观测集合标题{get;set;}
公共数据()
{
init();
}
公共void init()
{
标题=新的可观察集合()
{
“标题1”,
“标题2”,
“标题3”,
“标题4”
};
}
}
公共部分类窗口1:MetroWindow
{
私有数据;
公共窗口1()
{
init();
}
私有void init()
{
数据=新数据();
this.DataContext=this;
}
}
以及我的Xaml代码:
<TabControl DataContext="{Binding Datas}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding titles}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="Content" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
到目前为止,我已经找了几天了。我找到了一个话题,但似乎对我不起作用。我不确定是否可以在Window1类中同时使用这两种数据上下文,即使我尝试了类似的方法
我真的需要这样的东西吗?它似乎比我需要的要大,但我可能错了。所以,我的问题是,我希望我的标签标题是我列表中的标签,并且它不显示任何内容(尽管运行时没有错误)
感谢您的帮助,请慢一点回答,我还是Wpf新手:)在
窗口的数据上下文中设置选项卡控件的项资源,并定义公共属性数据
<TabControl ItemsSource="{Binding Datas.titles}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</TabControl.ItemTemplate>
public partial class Window1 : MetroWindow
{
public Window1()
{
init();
}
private void init()
{
Datas = new Datas();
this.DataContext = this;
}
public Datas Datas{get;set;}
}
公共部分类窗口1:MetroWindow
{
公共窗口1()
{
init();
}
私有void init()
{
数据=新数据();
this.DataContext=this;
}
公共数据集Datas{get;set;}
}
窗口:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TabControl ItemsSource="{Binding Titles}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="Content" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</Window>
窗口的代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
this.DataContext = new Datas();
this.InitializeComponent();
}
}
public class Datas
{
private ObservableCollection<String> titles;
public ObservableCollection<String> Titles
{
get
{
if (this.titles == null)
{
this.titles = new ObservableCollection<String>()
{
"Title 1",
"Title 2",
"Title 3",
"Title 4"
};
}
return this.titles;
}
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
this.DataContext=新数据();
this.InitializeComponent();
}
}
公共类数据
{
私人收藏所有权;
公众可观察的收藏标题
{
得到
{
if(this.titles==null)
{
this.titles=新的ObservableCollection()
{
“标题1”,
“标题2”,
“标题3”,
“标题4”
};
}
返回此文件。标题;
}
}
}
一些建议:
- 绑定仅适用于公共属性
- 如果不打算修改ObservableCollection,请不要公开它,而是使用IList(它更轻)
- 在WPF中,至少对于属性而言,延迟初始化比构造函数初始化更自然(请参阅Titles属性)
- 看一下,更喜欢使用Pascal大小写作为属性
感谢您的帮助,但它对我不起作用,它仍然没有显示任何内容。如果我没有错的话,ItemsSource可能是公共财产,所以我做了,然后。我不认为我在你的代码中遗漏了什么…你能检查一下你的输出窗口中的绑定错误吗?正如我所说的,我是WPF的新手。我很快就检查了如何做到这一点,如果绑定失败,它应该会向我返回警告。正如nit所说,这里没有,您必须检查输出窗口(在Visual Studio中)中是否有包含“System.Windows.Data Error”的行。绑定错误不会显示在应用程序中,它们根本不起作用。呜呼!它起作用了!非常感谢你找到这样的东西真是太痛苦了!谢谢你的链接和建议,我会尽快阅读/关注它们,我不认为这样做太“复杂”。但是如果我想使用多个DataContext呢?有什么理由把它放在InitializeComponent()方法之上吗?不客气!只有一个DataContext。您的ViewModel是Datas类,将您想要向视图公开的所有内容都放在那里。将代码放在InitializeComponent方法之上或之下的原因已经解释清楚了。好的,我明白了。我开始做类似的事情,但我必须重写我的代码。。。嗯,有趣的话题,我总是试着把它放在最后哈哈。我也会尝试找到一些关于绑定调试的东西,我一直想知道为什么它还没有实现。