2017-06-22 74 views
0

我是WPF的新手,我有一個問題,關注DataContext從MainWindow繼承到UserControl, ,它將作爲Tabpage附加到MainWindow的Tabcontrol。WPF DataContext從MainWindow繼承到UserControl

我的代碼片段如下:

UserControlModel.cs

public class UserControlModel : INotifyPropertyChanged 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
    } 

    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

ViewModelLocator.cs

public class ViewModelLocator 
{ 
    private UserControlModel UserControlModel { get; set; } 

    public ObservableCollection<UserControlModel> Users { get; set; } 

    public ViewModelLocator() 
    { 
     Users = new ObservableCollection<UserControlModel> 
     { 
      new UserControlModel { Name = "Albert" }, 
      new UserControlModel { Name = "Brian" } 
     }; 
    } 
} 

MainWindow.xaml

<Window.Resources> 
    <local:ViewModelLocator x:Key="VMLocator" /> 
</Window.Resources> 

<Grid HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="592"> 
    <Grid HorizontalAlignment="Left" Height="45" Margin="0,330,-1,-45" VerticalAlignment="Top" Width="593"> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="490,5,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 
    </Grid> 
    <TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="592" > 
     <TabItem x:Name="UserControlTabItem" Header="User Control"> 
      <Grid x:Name="UserControlTabpage" Background="#FFE5E5E5"> 
       <local:UserControl VerticalAlignment="Top" DataContext="{Binding Users, Source={StaticResource VMLocator}}" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
</Grid> 

我創建一個實例Ø f ViewModelLocator並將用戶實例綁定到MainWindow.xaml中的UserControl。

MainWindow.xaml.cs

public MainWindow() 
    { 
     InitializeComponent(); 
    } 

UserControl.xaml

<Grid> 
    <ListBox x:Name="lbUsers" DisplayMemberPath="???" HorizontalAlignment="Left" Height="250" Margin="30,27,0,0" VerticalAlignment="Top" Width="378"/> 
</Grid> 

UserControl.xaml.cs

private ObservableCollection<UserControlModel> _users; 

    public UserControl() 
    { 
     InitializeComponent(); 

     _users = ??? How to reference the Users instance created in MainWindow ??? 

     lbUsers.ItemsSource = _users; 
    } 

其實,我想告訴UserControlModel的Name屬性列表框。如果我是正確的,UserControl實例是 ,用Users實例作爲MainWindow的DataContext繼承。如何在UserControl.xaml.cs的代碼隱藏 中引用Users實例?我已檢查UserControl構造函數中的DataContext爲null!怎麼來的?什麼是 正確的方式/地方在代碼隱藏測試DataContext? 另外,如何在UserControl.xaml中設置ListBox的DisplayMemberPath屬性。非常感謝。

+0

您是否解決了以前的問題? https://stackoverflow.com/questions/44670303/wpf-bind-different-usercontrols-to-different-viewmodels。請記住接受答案:https:// meta。stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8

回答

0

我想你可以設置或用戶控制的XAML繼承的DataContext這樣

UserControl.xaml

<dialogs:Usercontrol DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext}" /> 
+0

添加建議的代碼後,我仍然無法獲得UserControl.xaml.cs中的用戶實例。謝謝。 – user1133555

+0

ViewModelLocator是MainWindow的ViewModel的權利?所以,你需要將其設置爲主窗口中的DataContext像下面 MainWindow.xaml.cs 公共主窗口(){ 在InitializeComponent (); this.DataContext = new ViewModelLocator(); } – VipinKV

+0

對不起,UserControl.xaml.cs的DataContext仍然爲空。我應該從MainWindow.xaml中刪除DataContext屬性:?謝謝。 – user1133555

0

您需要將ListBoxItemsSource屬性綁定到源集合。由於UserControlDataContextObservableCollection<UserControlModel>,你可以直接綁定到它:

<ListBox x:Name="lbUsers" ItemsSource="{Binding}" DisplayMemberPath="Name" ... /> 

還要確保你沒有明確設置UserControl別的地方在你的代碼的DataContext

雖然你應該能夠引用的DataContext一旦UserControl已加載:

public UserControl() 
{ 
    InitializeComponent(); 
    this.Loaded += (s, e) => 
    { 
     _users = DataContext as ObservableCollection<UserControlModel>; 
    }; 
} 

... ...有沒有必要設置ListBoxItemsSource財產代碼隱藏。您應該通過在XAML中創建綁定來完成此操作。

+0

UserControl現在可以從MainWindow實例綁定到Users實例。但是,UserControl的DataContext仍然爲空。謝謝。 – user1133555