C# 在XAML中绑定UserControl的DataContext不起作用(Windows Phone)
当我绑定C# 在XAML中绑定UserControl的DataContext不起作用(Windows Phone),c#,silverlight,windows-phone-7,mvvm,C#,Silverlight,Windows Phone 7,Mvvm,当我绑定UserControl的DataContext时,绑定工作正常。调试程序时,我可以看到UserControl的DataContext绑定到正确的ViewModel。但是,当我将UserControl中的特定属性(如文本框)绑定到ViewModel时,某些操作失败。UserControl将正确拾取ViewModel的初始值。如果我有一些默认值为“test”的绑定字符串属性,UserControl会正确显示该属性。但是,所有更改都不会传播回ViewModel。因此,在最初显示“test”的文
UserControl
的DataContext
时,绑定工作正常。调试程序时,我可以看到UserControl
的DataContext
绑定到正确的ViewModel
。但是,当我将UserControl
中的特定属性(如文本框)绑定到ViewModel
时,某些操作失败。UserControl
将正确拾取ViewModel
的初始值。如果我有一些默认值为“test”的绑定字符串属性,UserControl
会正确显示该属性。但是,所有更改都不会传播回ViewModel
。因此,在最初显示“test”的文本框中输入“abcd”不会将ViewModel
更新为“abcd”。ViewModel
不正确地包含“test”字符串
如果上述内容不清楚或不够具体,请继续。我将用代码和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);
}
}
//...
}
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
,该控件具有与ParentViewModel
中公开的ChildViewModel
属性关联的DataContext
绑定
<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>
如果有人能告诉我为什么这种方法不起作用,我会投票支持你的答案并说“谢谢!”
将绑定模式设置为双向将允许查看更新运行时在输出窗口中看到的内容?它是否说有一些绑定错误?没有报告错误。只是一些线程退出和dll被加载的消息。我试图重现这个问题,但没有成功。对我来说一切都很好。很难说你的应用出了什么问题。您确定从未在代码隐藏中设置DataContext吗?感谢您尝试重新设置。以上是实际编码的简化版本。我将再次浏览代码。我一定错过了什么!我做了更多的调试,现在问题对我来说更清楚了。我将重申我认为原始问题中存在的问题,并包含更多关于子视图的XAML示例。Doh!我认为双向模式是默认的。唉,事实并非如此。
<UserControl ... >
<StackPanel>
<!-- Binding to the Name property -->
<TextBox Text="{Binding Name}"/>
</StackPanel>
</UserControl>
<TextBox Text ="{Binding Name,
Mode=TwoWay}"/>