我想问你,如何在MainWindow中添加/显示特定的用户控件,但是依赖于当前登录到我的应用程序的用户。如果员工显示EmployeeModule,则显示Admin显示AdminModule。 我有LoginDialog。如果UserId和Pass正确,则检查数据库并获取Access。如果Access =“EE”则:
Dim mainmen As New EmployeeModule
MainMenu.Children.Add(mainmen)
Grid.SetRow(mainmen, 0)
我知道如何为代码隐藏中的每个模块执行此操作,但我需要为每个模块设置x:Name和x:FieldModifier,因为我需要从MainWindow访问每个用户控件。像那样:
<Grid x:Name="MainMenu" Grid.Row="0" Grid.Column="0" Background="Transparent" Margin="0,10,10,0" Height="694" VerticalAlignment="Top" Grid.RowSpan="2">
<local:EmployeeMainMenu x:Name="emploman" x:FieldModifier="public"/>
</Grid>
然后我使用“emploman”名称进入用户控件。
是否可以在xaml中执行此操作(对于具有可见性的每个项目添加,如果Access =“EE”(在这种情况下),将从例如隐藏为可见的更改。
一点点凌乱,但我希望你能理解我的观点......
非常感谢!
答案 0 :(得分:1)
最简单的方法是使用DataTemplate
。如果您不熟悉这些内容,那么您应该阅读MSDN上的Data Templating Overview页面。基本上,如果您为每种类型的数据声明DataTemplate
且未在其上设置x:Key
属性值,那么框架将隐式将它们应用于您的数据看到它时:
<DataTemplate DataType="{x:Type YourPrefix:Employee}">
<!-- Define your Employee XAML here -->
</DataTemplate>
<DataTemplate DataType="{x:Type YourPrefix:Admin}">
<!-- Define your Admin XAML here -->
</DataTemplate>
现在添加一个object
类型的属性(如果这是数据模型类的基类,则更好):
public object DataItem { get; set; } // Implement INotifyPropertyChanged here
然后您可以将数据绑定到ContentControl
:
<ContentControl Content="{Binding DataItem}" />
最后在您的代码中,您可以执行此操作,WPF将负责其余的工作:
if (Access == "EE") DataItem = new Employee();
else DataItem = new Admin();