在C#中设置TabControl的DisplayMemberPath

问题描述 投票:0回答:1

我用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;
    }
}
c# wpf binding tabcontrol
1个回答
5
投票

如果您清理并简化代码,将会看到设置DisplayMemberPath完全可以按照您的意愿进行:

XAML:

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

结果:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS80MEZPcC5wbmcifQ==” alt =“在此处输入图像描述”>“ >>

所以,问题不在于TabControl.DisplayMemberPath不起作用-它在代码中的其他位置。简化直到找到位置。

© www.soinside.com 2019 - 2024. All rights reserved.