2

WPF ウィンドウで定義された TabControl に動的に追加されるカスタム TabItem を作成しようとしています。カスタム コントロールには、テンプレートの特定の部分にバインドするデータを含むオブジェクトがあります。

<Style TargetType="{x:Type local:EntityTabItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:EntityTabItem}">
                <Border>
                    <Grid>
                        <Border x:Name="borderTop" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"/>
                        <StackPanel Orientation="Horizontal" Margin="0,0,2,0">
                            <!-- Want to bind the FileName to this TextBlock -->
                            <TextBlock VerticalAlignment="Center" Text="{Binding Path=Entity.FileName}" Margin="-1,0,0,0" Padding="6,1,10,1"/>
                            <Button x:Name="closeButton" VerticalAlignment="Center" Content="X" Style="{StaticResource TabCloseButton}"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid Background="White">
                    <!-- Want to bind the FileText to this TextBox -->
                    <TextBox Margin="15,0,0,0" BorderBrush="{x:Null}" Text="{Binding Path=Entity.FileText}"/>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

これは、カスタム コントロール CS ファイルです。

public class EntityTabItem : TabItem
{
    public Entity MyEntity { get; set; }

    public EntityTabItem(string path)
    {
        this.MyEntity = new Entity(path);
    }

    static EntityTabItem()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(EntityTabItem), new FrameworkPropertyMetadata(typeof(EntityTabItem)));
    }
}

どこかに DataBinding/Source を設定する必要があることは確かですが、TextBlock のバインディングを機能させるためにどこにバインドすればよいかわかりません。

正直なところ、DataBinding について頭を悩ませることはまったくできません。半分の時間は、方法を知らずに問題なく動作し、残りの半分の時間は何もしません。

「エンティティ」オブジェクトを DependencyProperty として実装しようとしましたが、それも機能しませんでした。CS でカスタム TabItem を作成しているだけなので (XAML で直接使用されることはありません)、これは問題になりますか?

4

1 に答える 1

0

たとえば、次のように DataContext プロパティを使用してみてください。

<Style TargetType="{x:Type local:EntityTabItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:EntityTabItem}">
                <Border>
                    <Grid>
                        <Border x:Name="borderTop" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"/>
                        <StackPanel Orientation="Horizontal" Margin="0,0,2,0">
                            <!-- Want to bind the FileName to this TextBlock -->
                            <TextBlock VerticalAlignment="Center" Text="{Binding Path=FileName}" Margin="-1,0,0,0" Padding="6,1,10,1"/>
                            <Button x:Name="closeButton" VerticalAlignment="Center" Content="X" Style="{StaticResource TabCloseButton}"/>
                        </StackPanel>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid Background="White">
                    <!-- Want to bind the FileText to this TextBox -->
                    <TextBox Margin="15,0,0,0" BorderBrush="{x:Null}" Text="{Binding Path=FileText}"/>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>


public class EntityTabItem : TabItem
{
    private Entity _myEntity;

    public Entity MyEntity
    {
        get { return _myEntity; }
        set
        {
            _myEntity = value;
            DataContext = value;
        }
    }

    public EntityTabItem(string path)
    {
        this.MyEntity = new Entity(path);
    }

    static EntityTabItem()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(EntityTabItem), new FrameworkPropertyMetadata(typeof(EntityTabItem)));
    }
}
于 2012-06-19T22:14:47.570 に答える