我正试图让我的头脑清醒,并且有一个相当简单的要求,我正在努力。
我正在使用RIA服务,在我的模型中,我有3个实体代表数据库中的视图。
在我的XAML视图中,我有一个组合框,允许用户从数据库中选择一个特定的视图,我有一个数据网格,应该显示用户选择的结果。我遇到的问题是,DomainContext.Load方法(当用户从ComboBox中选择一个项时调用)返回特定类型的EntitySet(IE EntitySet< Servers>或EntitySet< Apps>),具体取决于哪个视图是地选择。
我需要将网格绑定到我的ViewModel中的属性,但不能声明一个属性来保存EntitySet来自Load操作,因为每个Load操作都返回不同类型的EntitySet(< Apps>,< ;服务器>例如)。
是否存在可以将网格绑定到的通用类型,还将EntitySet转换为?
或者,我这样做完全错了吗?所有建议都欢迎,因为我正在挣扎:)
由于
米克
答案 0 :(得分:0)
使用2个不同的DataGrid控件(一个用于Apps
,一个用于Servers
)并在需要时隐藏/显示。您可能想要独立地自定义它们。
永远不要过于复杂,例如通过共享控件,仅仅因为GUI元素看起来相似。将它们视为ServerDataGrid控件和AppDataGrid控件。
答案 1 :(得分:0)
在视图模型上公开一个属性,用于管理要显示的项目列表:
public class MainViewModel
{
public INotifyPropertyChanged ListVM { get; private set; }
public SetList()
{
if(whatever)
ListVM = new ServerListViewModel(myServers);
else
ListVM = new AppListViewModel(myApps);
OnPropertyChanged("ListVM");
}
}
将ContentPresenter或ContentControl绑定到此属性。定义DataTemplates以使WPF解析显示相应DataGrid的正确视图:
<UserControl
x:Class="Foo.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:myNS="clr-namespace:Foo"
>
<UserControl.Resources>
<DataTemplate DataType="{x:Type myNS:ServerListViewModel}">
<myNS:ServerListView />
</DataTemplate>
<DataTemplate DataType="{x:Type myNS:AppListViewModel}">
<myNS:ServerListView />
</DataTemplate>
</UserControl.Resources>
<ContentPresenter Content="{Binding ListVM}" />
</UserControl>
当您使用不同的视图模型填充ListVM属性时,WPF将根据您定义的DataTemplates自动解析正确的视图。当然,如上所示,您不希望通过定义控件中的数据模板将视图与VM紧密耦合,因此请将它们放在最适合您的位置。