我有一个带有TabControl的MainWindow。每个选项卡都是存在于不同文件中的UserControl。
...
<TabControl>
<TabItem>
<local:Tab1>
</TabItem>
...
<TabItem>
<local:Tab2>
</TabItem>
</TabControl>
根据访问权限,这些UserControl应该有所不同。访问权限(int)在登录屏幕后通过以下方式传递到主窗口:
MainWindow mainWindow = new MainWindow(accessRights);
mainWindow.show();
现在我拥有MainWindow.xaml.cs中的访问权限。但是如何在UserControls中访问这些访问权限。
答案 0 :(得分:4)
您可以为每个UserControl
类添加依赖项属性:
public class Tab1 : UserControl
{
...
public Boolean HasAccess
{
get { return (Boolean)this.GetValue(HasAccessProperty); }
set { this.SetValue(HasAccessProperty, value); }
}
public static readonly DependencyProperty HasAccessProperty = DependencyProperty.Register(
"HasAccess", typeof(Boolean), typeof(Tab1), new PropertyMetadata(false));
}
...并将其绑定到XAML标记中父窗口的公共属性:
<TabControl>
<TabItem>
<local:Tab1 HasAccess="{Binding Path=WindowProperty, RelativeSource={RelativeSource AncestorType=Window}}" />
</TabItem>
...
</TabControl>
如何:实施依赖属性: https://msdn.microsoft.com/en-us/library/ms750428(v=vs.110).aspx
确保窗口类使用公共属性公开访问权限,因为您无法绑定到字段。
另一个选项是在加载后Window.GetWindow
代码隐藏中使用UserControl
方法获取对父窗口的引用:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
Loaded += (s, e) =>
{
MainWindow parentWindow = Window.GetWindow(this) as MainWindow;
if(parentWindow != null)
{
//access property of the MainWindow class that exposes the access rights...
}
};
}
}
答案 1 :(得分:1)
将此逻辑添加到用户控件中:
MainWindow mw = (MainWindow)this.Parent;
accessRights = mw.accessRights;
这是逻辑,您可能需要更改上面的代码以匹配语法等。
答案 2 :(得分:0)
将MainWindow实例的引用传递给UserControl实例的构造函数,同时创建它们。通过这样做,您可以在UserControls代码中访问包含主表单的公共属性。
答案 3 :(得分:0)
尝试使用Prism.Core中的EventAggregator,基本上你设置发布方法,你传递你的int并在那个用户控件中订阅那个事件,事件将在你的情况下加载窗口。
MainWindowViewModel
public MainWindowViewModel( IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<PassingIntToUserControlEvent>().Publish(HereGoesYourInt);
}
UserControlViewModel
public UserControlViewModel( IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<PassingIntToUserControlEvent>().Subscribe(SomeMethodYouWantWithYourInt);
}
并设置PassingIntToUserControlEvent非常简单。
public class PassingIntToUserControlEvent : PubSubEvent<int>{}
和你要去的地方。
这段视频对Prism及其中的一些组件有基本的介绍,其中一个是EventAggregator。我发现它非常有用。希望能帮助到你。 https://www.youtube.com/watch?v=ZfBy2nfykqY