2017-03-20 67 views
1

我有一個帶有TabControl的MainWindow。每個選項卡都是存在於不同文件中的UserControl。從UserControl訪問Window屬性子項

... 
<TabControl> 
    <TabItem> 
     <local:Tab1> 
    </TabItem> 
... 
    <TabItem> 
     <local:Tab2> 
    </TabItem> 
</TabControl> 

這些用戶控件應根據訪問權限的不同而行爲不同。

MainWindow mainWindow = new MainWindow(accessRights); 
mainWindow.show(); 

現在我在MainWindow.xaml.cs的訪問權限:訪問權限(一個int)通過傳遞到主窗口的登錄屏幕後。但是我怎樣才能訪問UserControls中的這些訪問權限。

+1

如何用靜態實例創建'UserManagement'類,然後讓你的'UserControl'和其他控件,類從這個實例中獲取'int'? –

回答

2

你可以依賴屬性添加到每個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... 
      } 
     }; 
    } 
} 
0

在創建它們時,將MainWindow實例的引用傳遞給UserControl實例的構造函數。通過這樣做,您可以訪問UserControls代碼中包含主表單的公共屬性。

+0

但是我在xaml中創建了UserControl實例。那麼我怎樣才能通過參考? – L3n95

+0

Ooops,錯過了WPF部分;-) 所以,也許你可以在你的UserControl中使用'Window parentWindow = Window.GetWindow(this);'來訪問包含主窗口。 –

0

這種邏輯添加到您的用戶控件:

MainWindow mw = (MainWindow)this.Parent; 
accessRights = mw.accessRights; 

這是什麼邏輯,你可能需要更改上面的代碼以符合語法等

+0

當我在UserControl構造函數中使用它時,mw引用始終爲空。 – L3n95

+0

首先調用子UserControl構造函數,然後調用父項,因此將上述邏輯移至UserControls中的非構造函數方法。 –

0

與EventAggregator從Prism.Core嘗試,基本上,你設置發佈方法,你傳遞你的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