0

カスタム コントロールを作成しましたが、データ バインディングに奇妙な問題があります。Statusコントロールには、タイプ のオブジェクトを必要とするDependencyProperty が呼び出されていますStatusBlockData。オブジェクトを作成するStatusBlockData場合は、それをウィンドウの DataContext として直接使用し、コントロールをStatus={Binding .}バインド作業にバインドします。

しかし、ビューでオブジェクトをプロパティとして作成し、public StatusBlockData Status { get; set; }ビューをウィンドウの DataContext として使用し、コントロールのバインディングを に変更すると、Status="{Binding Status}"もう機能しません。

私は主に混乱しています。どちらの場合も、オブジェクトにバインドしStatusBlockDataますよね? ここにいくつかのコードがあります。最初のケースではバインディングが適切に機能するため、コントロールのスタイルは重要ではないと思います。

これは私の見解です(Headerプロパティはテスト専用です):

public ViewMainWindow()
    {
        Status = new StatusBlockData(5);
        Status.SetStatus("does not work", StatusIcon.Information);
        Header = "Binding works";
    }

    public string Header { get; set; }
    public StatusBlockData Status { get; set; }
}

ビューを使用しても機能しません:

public MainWindow()
{
    InitializeComponent();

    ViewMainWindow view = new ViewMainWindow();
    this.DataContext = view;
    view.Status.SetStatus("this is not displayed", StatusIcon.Success);
}

XAML は次のようになります (再度 - ヘッダーはテスト専用です)。

<GrassoftUtils:StatusBlock Status="{Binding Status}" Background="Red" Width="159"/>
<TextBlock Text="{Binding Header}" HorizontalAlignment="Left" Margin="168,101,0,0" VerticalAlignment="Top" />

しかし、ビューがなければ、それは機能します:

public MainWindow()
{
    InitializeComponent();

    StatusBlockData Status = new StatusBlockData(5);
    this.DataContext = Status;
    Status.SetStatus("this works", StatusIcon.Information);
}

そしてバインディング(そしてテキストブロックはもちろん空です):

<GrassoftUtils:StatusBlock Status="{Binding .}" Background="Red" Width="159"/>
<TextBlock Text="{Binding Header}" HorizontalAlignment="Left" Margin="168,101,0,0" VerticalAlignment="Top" />

私が気付いたもう 1 つの奇妙なこと: のバインディングはStatus="{Binding .}"、単語の背後にあるものに関係なく、常に機能しますBinding。失敗すると思います。それは問題の一部ですか?

保存するために、これはコントロールのスタイルです:

<Style TargetType="{x:Type Controls:StatusBlock}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Controls:StatusBlock}">
                <Grid Height="24" Background="{TemplateBinding Background}" Visibility="{Binding Path=StatusVisible, Converter={StaticResource VisibilityConverter}}">
                    <Image  Height="24" Width="24" Source="{Binding StatusIcon, Converter={StaticResource StatusIconConverter}}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                    <TextBlock Margin="28,0,0,0" Text="{Binding StatusText}" HorizontalAlignment="Left" VerticalAlignment="Center"   />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
4

2 に答える 2

0

私見、それはテンプレートバインディングと関係があります。それ以来、あなたはカスタムコントロールを書いたと言いました。
これを試して、

例えば。

<TextBlockText="{TemplateBinding StatusText}"/>
于 2013-06-02T14:08:00.077 に答える