データバインディング用の依存関係プロパティを持つカスタム コントロールを作成しました。バインドされた値はテキスト ボックスに表示されます。このバインドは正しく機能します。
カスタム コントロールを実装すると、問題が発生します。グリッドのデータ コンテキストは、バインド用の String プロパティを含む単純なビュー モデルです。
- このプロパティを標準の wpf コントロール テキスト ボックスにバインドすると、すべて正常に動作します。
- プロパティをカスタム コントロールにバインドしても、何も起こりません。
いくつかのデバッグの後、SampleTextがCustomControlで検索されていることがわかりました。もちろんそこには存在しません。シナリオ 1のように、プロパティがCustomControlで検索され、 DataContextから取得されないのはなぜですか。
<Window x:Class="SampleApplicatoin.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:SampleApplication"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.DataContext>
<controls:ViewModel/>
</Grid.DataContext>
<TextBox Text="{Binding SampleText}"/>
<controls:CustomControl TextBoxText="{Binding SampleText}"/>
</Grid>
</Window>
カスタム コントロールのXAMLコードの下。DataContext = Selfを使用して、コード ビハインドから依存関係プロパティを取得します。
<UserControl x:Class="SampleApplication.CustomControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="87,133,0,0" TextWrapping="Wrap" Text="{Binding TextBoxText}" VerticalAlignment="Top" Width="120"/>
</Grid>
</UserControl>
xaml.cs ファイルには依存関係プロパティのみが含まれています。
public partial class CustomControl : UserControl
{
public static readonly DependencyProperty TextBoxTextProperty = DependencyProperty.Register("TextBoxText", typeof (String), typeof (CustomControl), new PropertyMetadata(default(String)));
public CustomControl()
{
InitializeComponent();
}
public String TextBoxText
{
get { return (String) GetValue(TextBoxTextProperty); }
set { SetValue(TextBoxTextProperty, value); }
}
}
これについて助けてくれてありがとう。それは本当に今私を夢中にさせます。
編集:
私は2つの可能な解決策を見つけました:
ここに最初のものがあります(私にとってはうまくいきます):
<!-- Give that child a name ... -->
<controls:ViewModel x:Name="viewModel"/>
<!-- ... and set it as ElementName -->
<controls:CustomControl TextBoxText="{Binding SampleText, ElementName=viewModel}"/>
2つ目。私の場合、これはうまくいきません。どうしてか分かりません:
<controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:ViewModel}}}"/>
<!-- or -->
<controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType=controls:ViewModel}}"/>