【发布时间】:2014-04-07 12:10:03
【问题描述】:
我对 WPF 很陌生,现在遇到了一个我找不到任何有效解决方案的场景。 在我的项目中,我有许多视图模型和用户控件。主窗口分为两个,在左侧我根据当前的视图模型显示用户控件,这一切正常。当我想根据用户在左侧选择的内容在右侧显示第二个用户控件时,问题就开始了。用户控件有很多文本框和组合框。我将如何从同序视图模型中绑定这些数据?
//mainwindow.xaml
<Window.resources>
<Datatemplate Datatype={x:Type vm:Viewmodel1}>
<loc:Usercontrol1/> // in the left hand side
</DataTemplate>
<Datatemplate Datatype={x:Type vm:Viewmodel2}>
<loc:Usercontrol2/> // in the lefthand side
</DataTemplate>
</Window.Resources>
...
<Grid Grid.Column="0">
<ContentControl Content={Binding CurrentViewModel}/>
</Grid>
<Grid Grid.Column="1">
<Grid.Resources>
<Datatemplate Datatype={x:Type vm:Viewmodel1}>
<loc:Usercontrol3 NameDp={Binding Name}/> // in the right hand side
</DataTemplate>
<Datatemplate Datatype={x:Type vm:Viewmodel2}>
<loc:Usercontrol3/> // in the rightthand side
</DataTemplate>
</Grid.Resources>
</Grid>
// Usercontrol3.xaml
<Grid>
<TextBox Text="{Binding Path=NameDp, ElementName=UserControl3}" />
</Grid>
// UserControl3.cs
public static readonly DependencyProperty NameUCProperty =DependencyProperty.Register("NameDp", typeof(string), typeof(UserControl3), new FrameworkPropertyMetadata(NamePropertyChanged));
public string NameDp
{
get
{
return (string)GetValue(NameUCProperty);
}
set
{
SetValue(NameUCProperty, value);
}
}
//ViewModel
Public Name {get;set;}
在每个视图模型中,我从数据库中获取数据,我想根据用户选择将这些数据绑定到右侧的用户控件。我如何绑定这些数据? 这是正确的方法还是我完全错了?
【问题讨论】:
-
您只需定义一次数据模板,无需多次。从绑定的源开始,在逻辑树上执行搜索以找到与绑定对象的数据类型匹配的第一个数据模板。除此之外,这看起来是正确的。它不工作吗?
-
@Will 正如我提到的,我想先加载左侧,然后当用户选择我想在右侧打开下一个用户控件的内容时。如果我放在一起,我将如何指出应该首先显示的内容。
-
@Will 左侧工作完美。这样甚至可以在右侧加载用户控件。真正的问题是第二组用户控件无法绑定。文本框始终为空白。不明白
-
嗯,取决于。 “当用户选择某物时”是什么意思?例如,如果 UC1 显示一个项目列表,而您希望 UC2 显示所选项目......这很容易。在 UC1 中,将列表的 SelectedItem 属性绑定到 UserControl 上的公共 DependencyProperty(是的,代码隐藏)。然后,在 Window 中,将第二个 ContentControl 绑定到该公共 DependencyProperty。
-
@Will Yes 左侧总是列表,当用户从列表中选择一个项目时。项目的详细信息应显示在 UC2 中。目前,当用户双击时,我已经在视图模型中实现了一个命令,并将所选项目作为命令参数发送到数据库中搜索以获取更多详细信息。一旦我有了,我想从那里直接绑定到用户控件。如果可能的话。我不确定该怎么做。小的伪代码会很有帮助。
标签: c# wpf mvvm user-controls