C# 在C中设置TabControl的DisplayMemberPath#

C# 在C中设置TabControl的DisplayMemberPath#,c#,wpf,binding,tabcontrol,C#,Wpf,Binding,Tabcontrol,我用C代码创建了一个TabControl。我将其ItemsSource绑定到集合并设置边距。 由于某些原因,设置其DisplayMemberPath无效 _tabControl = new TabControl(); _tabControl.Margin = new Thickness(5); _tabControl.DisplayMemberPath = "Header"; _tabControl.SetBinding(ItemsControl.ItemsSourceProperty, ite

我用C代码创建了一个TabControl。我将其ItemsSource绑定到集合并设置边距。 由于某些原因,设置其DisplayMemberPath无效

_tabControl = new TabControl();
_tabControl.Margin = new Thickness(5);
_tabControl.DisplayMemberPath = "Header";
_tabControl.SetBinding(ItemsControl.ItemsSourceProperty, itemsSourceBinding);
集合中的每个项都有一个名为“Header”的属性

为什么这不起作用

安德烈

编辑: 以下是所有相关代码:

public partial class VariationGroupPreviewOptionsView
{
    public string Header { get; set; }

    public VariationGroupPreviewOptionsView()
    {
        InitializeComponent();
        DataContext = new VariationGroupPreviewOptionsViewModel();
    }
}

private void OptionsCommandExecute()
{
    var dlg = new OptionsDialog();
    dlg.ItemsSource = new List<ContentControl>() {new VariationGroupPreviewOptionsView(){Header = "Test"}};
    dlg.ShowDialog();
}

public class OptionsDialog : Dialog
{

    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register("ItemsSource", typeof (IEnumerable), typeof (OptionsDialog), new PropertyMetadata(default(IEnumerable)));

    public IEnumerable ItemsSource
    {
        get { return (IEnumerable) GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    private readonly TabControl _tabControl;


    public OptionsDialog()
    {
        DataContext = this;
        var itemsSourceBinding = new Binding();
        itemsSourceBinding.Path = new PropertyPath("ItemsSource");

        _tabControl = new TabControl();
        _tabControl.Margin = new Thickness(5);
        _tabControl.DisplayMemberPath = "Header";
        _tabControl.SetBinding(ItemsControl.ItemsSourceProperty, itemsSourceBinding);

        var recRectangle = new Rectangle();
        recRectangle.Margin = new Thickness(5);
        recRectangle.Effect = (Effect)FindResource("MainDropShadowEffect");
        recRectangle.Fill = (Brush)FindResource("PanelBackgroundBrush");

        var grdGrid = new Grid();
        grdGrid.Children.Add(recRectangle);
        grdGrid.Children.Add(_tabControl);

        DialogContent = grdGrid;
    }
}
public分部类变量GroupPreviewOptions视图
{
公共字符串头{get;set;}
公共变量组预览选项视图()
{
初始化组件();
DataContext=新变量GroupPreviewOptionsViewModel();
}
}
私有无效选项CommandExecute()
{
var dlg=新选项对话框();
dlg.ItemsSource=new List(){new VariationGroupPreviewOptionsView(){Header=“Test”};
dlg.ShowDialog();
}
公共类选项对话框:对话框
{
公共静态只读依赖项Property ItemsSourceProperty=
DependencyProperty.Register(“ItemsSource”、typeof(IEnumerable)、typeof(Options对话框)、new PropertyMetadata(default(IEnumerable));
公共IEnumerable ItemsSource
{
get{return(IEnumerable)GetValue(ItemsSourceProperty);}
set{SetValue(ItemsSourceProperty,value);}
}
私有只读TabControl\u TabControl;
公共选项对话框()
{
DataContext=this;
var itemsSourceBinding=新绑定();
itemsSourceBinding.Path=新属性路径(“ItemsSource”);
_tabControl=新的tabControl();
_tabControl.Margin=新厚度(5);
_tabControl.DisplayMemberPath=“Header”;
_tabControl.SetBinding(ItemsControl.ItemsSourceProperty,itemsSourceBinding);
var recRectangle=新矩形();
再收缩角。边缘=新厚度(5);
recRectangle.Effect=(Effect)FindResource(“MainDropShadowEffect”);
recRectangle.Fill=(画笔)FindResource(“PanelBackgroundBrush”);
var grdGrid=new Grid();
grdGrid.Children.Add(ReclectAngle);
grdGrid.Children.Add(_-tabControl);
DialogContent=grdGrid;
}
}

如果您清理并简化代码,您将看到设置
DisplayMemberPath
的效果与您希望的完全一样:

XAML:


代码:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=新列表
{
新tabitem模型
{
Header=“第一个”
},
新tabitem模型
{
Header=“第二个”
},
};
}
}
公共类tabitem模型
{
公共字符串头
{
得到;
设置
}
}
结果:


所以,问题不在于
TabControl.DisplayMemberPath
不起作用,而是在代码的其他地方。简化,直到找到位置。

如果清理并简化代码,您将看到设置
DisplayMemberPath
完全按照您的要求工作:

XAML:


代码:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=新列表
{
新tabitem模型
{
Header=“第一个”
},
新tabitem模型
{
Header=“第二个”
},
};
}
}
公共类tabitem模型
{
公共字符串头
{
得到;
设置
}
}
结果:


所以,问题不在于
TabControl.DisplayMemberPath
不起作用,而是在代码的其他地方。简化,直到找到位置。

请描述“不工作”。选项卡项标题为空。要删除边距,不会更改任何内容。您在哪里设置选项卡控件的itemsource?我在第一篇文章中添加了所有相关代码。请描述“不工作”。TabItem标题为空。若要删除边距,则不会更改任何内容。您将_tabControl的itemsource设置在何处?我在第一篇文章中添加了所有相关代码。我做了一些测试,发现如果您的项继承自“Control”,则会出现这些问题。我做了一些测试,发现如果您的项继承自“控件”。
<TabControl ItemsSource="{Binding}" DisplayMemberPath="Header"/>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new List<TabItemModel>
        {
            new TabItemModel
            {
                Header = "First"
            },
            new TabItemModel
            {
                Header = "Second"
            },
        };
    }
}

public class TabItemModel
{
    public string Header
    {
        get;
        set;
    }
}