ItemsControl
またはから「エスケープ」しようとしてDataGridView
いるWindow
場合は、AncestorTypeofがx:Type Window
機能しないことに気付く可能性があります。または、少なくともそうではないようです...
この場合、おそらくBlendまたはVisual Studioを実行していて、設計時にデータが表示されることを期待しています。これは、VS+Blendの両方が実際にはWindowsではない独自のインスタンスを作成するためです。実行時には問題なく動作しますが、デザインモードでは動作しません。
できることがいくつかあります。
UserControlでラップする
これが私が思いついた代替ソリューションです。UserControl
またはを直接参照していないという利点が1つあります。Window
そのため、親コンテナを変更しても、コードが破損することはありません。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:MyWPFApplication.Views"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyWPFApplication.Views.UPCLabelPrinterWindow"
mc:Ignorable="d"
x:Name="LayoutRoot"
Title="UPCLabelPrinterWindow">
<views:DataContextWrapper>
<DockPanel>
...
</DockPanel>
</views:DataContextWrapper>
DataContextWrapper
グリッドはどこにありますか
namespace MyWPFApplication.Views {
public class DataContextWrapper : Grid
{
}
}
次に、バインドするときにこれを行います:
<TextBlock Text="{Binding="{Binding DataContext.SomeText,
RelativeSource={RelativeSource AncestorType={x:Type views:DataContextWrapper},
Mode=FindAncestor}}" />
注:ウィンドウ自体のプロパティにバインドする場合は注意が必要です。おそらく、依存関係プロパティなどを介してバインドする必要があります。しかし、MVVMを使用している場合、これは私が見つけた1つの解決策です。