我正在使用MahApps作为我的第一个Wpf项目,更具体地说是tabControls。我在一个很小的测试项目上测试过它。它运行良好,直到我尝试在我的项目中合并我的代码。
以下是我的代码背后的示例:
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;
}
}
我的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>
到目前为止,我一直在寻找几天。我找到了一个关于dataBinding to another class的话题,但它似乎对我不起作用。不确定我是否可以在我的Window1类中使用这两个DataContexts,即使我尝试了类似binding multiple controls to different dataContexts的内容。
我真的需要这样的东西吗?它看起来比我需要的要大,但我可能错了。所以,我的问题是我希望我的标签的标题是我的列表中的标题,并且它不会显示任何内容(运行时没有错误)。
感谢您的帮助,请您的回答缓慢,我还是Wpf的新手:)
答案 0 :(得分:1)
窗口:
<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>
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;
}
}
}
一些建议:
绑定仅适用于公开属性。
如果您不打算修改它,请不要公开ObservableCollection,而是使用IList(它更轻)。
在WPF中,至少对于属性,延迟初始化比构造函数初始化更自然(参见Titles属性)。
看一下.NET capitalization conventions,更喜欢使用Pascal Casing来获取属性。
答案 1 :(得分:0)
设置ItemsSource
的{{1}}并在TabControl
Datas
Window
DataContext
<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;}
}