をバインドするDataContextと、バインドがUserControl正しく機能します。DataContextプログラムをデバッグすると、 のUserControlが正しい にバインドされていることがわかりますViewModel。ただし、 で特定のプロパティ (テキスト ボックスなど) にバインドするとUserControl、ViewModel何かが失敗します。はのUserControl初期値をViewModel正しく取得します。デフォルト値が「test」のバインディング文字列プロパティがある場合、UserControlこれは正しく表示されます。ただし、変更が に反映されることはありませんViewModel。そのため、最初に「test」と表示されていたテキスト ボックスに「abcd」と入力しても、「abcd」に更新ViewModelされません。にはViewModel、「テスト」文字列が誤って含まれています。
上記が不明確または十分に具体的でない場合は、続行してください。コードと XAML スニペットを使用してアーキテクチャをレイアウトします。
他の VM を集約する VM があります。この親 VM では、子 VM がバインド可能なプロパティとして公開されます。
public class ParentViewModel : ViewModel
{
#region Binding Properties
private const string ChildViewModelPropertyName = "ChildViewModel";
private ChildViewModel childViewModel = new ChildViewModel();
public ChildViewModel ChildViewModel
{
get { return this.childViewModel ; }
set
{
if (value == this.childViewModel )
{
return;
}
this.childViewModel = value;
RaisePropertyChanged(ChildViewModelPropertyName);
}
}
//...
}
これは典型的な VM であり、テキスト ボックスにバインドしたいChildViewModelなどの他のプロパティを公開します。Strings
public class ChildViewModel : ViewModel
{
#region Binding Properties
private const string NamePropertyName = "Name";
private string name = "";
public string Name
{
get { return this.name; }
set
{
if (value == this.name)
{
return;
}
this.name = value;
RaisePropertyChanged(NamePropertyName);
}
}
//...
}
XAML に。最初の XAML スニペットはページ全体を表し、このページDataContextはParentViewModel. このページには、で公開されているプロパティに関連付けられUserControlたバインディングを持つ が含まれています。DataContextChildViewModelParentViewModel
<phone:PhoneApplicationPage ...>
<!-- Sets the DataContext for the page. -->
<phone:PhoneApplicationPage.DataContext>
<vm:ParentViewModel/>
</phone:PhoneApplicationPage.DataContext>
<ScrollViewer>
<phone:Pivot>
<phone:PivotItem>
<!-- ChildView is the UserControl whose DataContext should be bound to ChildViewModel -->
<view:ChildView DataContext="{Binding ChildViewModel}"/>
</phone:PivotItem>
</phone:Pivot>
</ScrollViewer>
</phone:PhoneApplicationPage>
ChildViewXAML は非常に簡単です。Nameのプロパティにバインドされたテキスト ボックスがありますChildViewModel。明確にするために、上記のスニペットで既にバインドされているため、DataContext何もバインドしません。ChildView
<UserControl ... >
<StackPanel>
<!-- Binding to the Name property -->
<TextBox Text="{Binding Name}"/>
</StackPanel>
</UserControl>
このアプローチがうまくいかない理由を誰かが教えてくれたら、私はあなたの答えに賛成票を投じて「ありがとう!」と言います。