カスタム コントロールを作成しましたが、データ バインディングに奇妙な問題があります。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>