Ich frage mich, ob es möglich ist, einen Datenkontext zwischen einem Windows und UserControl in C#/WPF freigegeben.Share DataContext zwischen MainWindows und UserControl
Ich habe ein Hauptfenster wie folgt aus (nicht abgeschlossen):
MainWindow.xaml:
<Window x:Class="MyProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyProject"
xmlns:v="clr-namespace:MyProject.Views"
mc:Ignorable="d"
Title="MyProject" >
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<v:GenerateView/>
<v:ReadView/>
</Grid>
</Window>
MainViewModel.cs:
public class MainViewModel : ViewModelBase
{
#region Properties
#endregion
#region Fields
#endregion
#region Constructor
public MainViewModel()
: base()
{
}
#endregion
#region Methods
#endregion
#region Commands
#endregion
}
In Abhängigkeit von einem zukünftigen Parameter, ich will zeige meine Ansicht GenerateView oder ReadView an. Eigentlich entwickle ich das UserControl GenerateView, aber ich frage mich, ob ich denselben Datacontext verwenden kann.
Nach that post, ich damit begonnen:
<UserControl x:Class="MyProject.Views.GenerateView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyProject.Views"
xmlns:p="clr-namespace:MyProject.Properties"
xmlns:MyProject="clr-namespace:MyProject"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyProject:MainWindow}}}">
<Grid>
</Grid>
</UserControl>
aber es funktioniert nicht, wenn ich versuche, in Datacontext GenerateView
zugreifen zu können, ist null.
Edit:
vergaß ich einen Teil meines Code:
public partial class GenerateView : UserControl
{
private MainViewModel Context
{
get
{
return DataContext as MainViewModel;
}
}
public GenerateView()
{
InitializeComponent();
Context.PropertyChanged += Context_PropertyChanged;
}
private void Context_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
//Action to perform
}
}
Die Linie Context.PropertyChanged += Context_PropertyChanged;
eine Ausnahme werfen, weil Datacontext null ist.
Datacontext geerbt wird auf alle unten Untergeordnete Steuerelemente, falls nicht explizit festgelegt. Versuchen Sie, es aus Ihren Benutzersteuerelementen zu entfernen und legen Sie es nur im Fenster fest. –
Der DataContext wird auch erst nach dem Aufruf des Konstruktors gesetzt. Verwenden Sie das DataContextChanged-Ereignis, um zu wissen, wann es gesetzt ist. – Andrew
@Nudity Ich habe es aus UserControls entfernt und getestet. DataContext ist null im Konstruktor GenerateView, aber nach 'InitializeComponent' aus' MainViewModel' ist DataContext für beide korrekt. Aber ich kann 'Context.PropertyChanged' nicht auf meinem UserControl setzen @Andrew Perfect! –