当我绑定DataContext
aUserControl
时,绑定工作正常。当我调试程序时,我可以看到 的DataContext
绑定UserControl
到正确的ViewModel
. 但是,当我绑定到 中的特定属性(如文本框)时UserControl
,ViewModel
某些事情会失败。将正确UserControl
获取初始值。ViewModel
如果我有一些默认值为“test”的绑定字符串属性,UserControl
则会正确显示。但是,没有任何更改会传播回ViewModel
. 因此,在最初显示“test”的文本框中输入“abcd”不会将其更新ViewModel
为“abcd”。ViewModel
错误地包含“测试”字符串。
如果上述内容不清楚或不够具体,请继续。我将使用代码和 XAML 片段来布置我的体系结构。
我有一个聚合其他虚拟机的虚拟机。在此父虚拟机中,子虚拟机作为可绑定属性公开。
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);
}
}
//...
}
这ChildViewModel
是您的典型 VM,它公开了一些其他属性,例如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
该绑定DataContext
与.ChildViewModel
ParentViewModel
<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>
ChildView
XAML 非常简单。有一个文本框绑定Name
到ChildViewModel
. 为了清楚起见,我没有绑定任何内容DataContext
,ChildView
因为它已经绑定在上面的代码段中。
<UserControl ... >
<StackPanel>
<!-- Binding to the Name property -->
<TextBox Text="{Binding Name}"/>
</StackPanel>
</UserControl>
如果有人能告诉我为什么这种方法不起作用,我会支持你的回答并说“谢谢!”。