来自UserControl子的Access窗口属性

时间:2017-03-20 10:16:39

标签: c# wpf xaml user-controls window

我有一个带有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中访问这些访问权限。

4 个答案:

答案 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