Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF选项卡控件数据绑定到另一个类_C#_Wpf_Xaml_Data Binding_Mahapps.metro - Fatal编程技术网

C# 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

我正在使用我的第一个Wpf项目,更具体地说。我在一个小测试项目上测试了它。它工作得很好,直到我尝试将代码合并到我的项目中

下面是我的代码隐藏示例:

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方法之上或之下的原因已经解释清楚了。好的,我明白了。我开始做类似的事情,但我必须重写我的代码。。。嗯,有趣的话题,我总是试着把它放在最后哈哈。我也会尝试找到一些关于绑定调试的东西,我一直想知道为什么它还没有实现。