0

ItemSource プロパティを使用してコレクションを TabControl にバインドしています。

より深く理解するために、XAML ではなくコードで WPF をプログラミングしています。

私が直面している問題は、TabItem のヘッダーをプロパティ ("EntityID") にバインドしたい場合、バインディングが開始されないことです。

バインディングの代わりに値を設定すると、コードが機能します(コメントの下のコード)

var binding = new Binding();
binding.Path = new PropertyPath("EntityID");

DataTemplate itemTemplate = new DataTemplate();
var label = new FrameworkElementFactory(typeof(Label));

//label.SetValue(Label.ContentProperty,"test");
label.SetBinding(Label.ContentProperty, binding);

itemTemplate.VisualTree = label;

_tabControl.ItemTemplate = itemTemplate;

さらに、ItemTemplate の代わりに ContentTemplate を設定すると、バインディングも機能します。

タブヘッダーを純粋なコードから ItemsSource のプロパティにバインドするにはどうすればよいですか?

4

2 に答える 2

1

コードビハインドからバインディングを設定する方法はたくさんあります。バインドを試みる必要があるのは、TabItemのHeaderPropertyです。それを行うには、最初にそれを取得する必要がありますが。

これがあなたが始めたはずの実際の例です。xamlで行うように、それは私が行う方法ではありませんが、コードビハインドからそれを行うように要求したので、ここに行きます:)

ちなみに、コードビハインドでテンプレートを定義することはほとんどの場合悪い考えです。可能な限りそれを避けるようにしてください。

Windows.xaml

<Window x:Class="StackOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:StackOverflow"
    Title="Super long title of the super window" Width="500" Height="300">

    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Entity}">
            <TextBlock Text="{Binding Id}" FontSize="{Binding Size}" />
        </DataTemplate>
    </Window.Resources>

    <local:MyTabControl x:Name="tabControl" ItemsSource="{Binding Entities}" />

</Window>

Window.xaml.cs

using System.Windows;
using System;
using System.Windows.Data;
using System.Collections.Generic;
using System.Windows.Controls;

namespace StackOverflow
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public IEnumerable<Entity> Entities
    {
        get
        {
            for (int i = 0; i < 5; i++)
            {
                yield return new Entity() { Id = i };
            }
        }
    }
}

public class MyTabControl : TabControl
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        var tabitem = base.GetContainerForItemOverride() as TabItem;
        if (tabitem != null)
        {
            tabitem.Loaded += OnTabItemLoaded;
        }
        return tabitem;
    }

    void OnTabItemLoaded(object sender, RoutedEventArgs e)
    {
        var tabItem = sender as TabItem;
        if (tabItem == null)
            throw new InvalidOperationException();
        tabItem.SetBinding(TabItem.HeaderProperty, new Binding("DisplayName"));
    }
}

public class Entity : DependencyObject
{
    public int Id { get; set; }
    public string DisplayName { get { return "Entity ID : " + Id; } }
}
}
于 2012-10-26T11:34:56.627 に答える
1

いくつかのこと...

WPF デザイナーおよび開発者として、XAML は GUI とコード ビハインドを分離する最良の方法です。WPF に対する私の理解が減ることはありません。そこで、XAML をお勧めします。

私自身が Winforms/ASP.NET 開発者であると信じてください。最初は XAML を使用することに消極的でしたが、記述しなければならなかった膨大な量のコードと、さまざまな GUI 要素間の関係と、\ \と呼ばれる獣を飼いならすために、 C# のコード ビハインドは、私にとって単なる拷問でした。TemplatesStylesTriggersResourceDictionaries

私の経験は十分です、これはあなたの問題です!!

あなたの質問に答えるために、あなたは設定しました_tabControl.ItemsSourceか?そして、その各アイテムItemsSourceEntityIDプロパティがあることを確認してください。コードが機能するはずです。

Outputそれでもうまくいかない場合は、Visual Studio のウィンドウでバインディング エラーがないか確認してください。

于 2012-10-26T11:36:49.590 に答える