WPF TabControl DataBinding到另一个类

时间:2014-05-23 08:53:58

标签: c# wpf xaml data-binding mahapps.metro

我正在使用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的新手:)

2 个答案:

答案 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;}
}