私はWPF MVVMがどのように機能するかについて質問がありますオンラインのチュートリアルのほとんどは、単一のウィンドウを使用して例を示しているようですので、複数のウィンドウ/ページ/ユーザーコントロールでこれを正しく実行しているかどうかはわかりません。
という名前のクラスがある場合 ViewModel
私は DataContext
に MainWindow
以下のコードを使用して、 DataContext
の MainWindow
のみ。
MainWindow.xaml.cs:
public partial class MainWindow
{
Private ViewModel viewModel = new ViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = this.viewModel;
}
}
次に、新しいユーザーコントロールを作成し、viewModelへのパスを指定せずにDataGridをバインドした場合、 DataContext
ユーザーコントロールの?
これはWPFの仕組みですか、ユーザーコントロールでDataContextも設定する必要がありますか?これを行う正しい方法は何ですか?
MainSignals.xaml:
<UserControl x:Class="ProjectXYZ.Content.MainSignals"
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:core="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:ProjectXYZ.Content"
xmlns:mui="http://firstfloorsoftware.com/ModernUI"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" >
<Grid>
<DockPanel>
<DataGrid Name="DG1" ItemsSource="{Binding ReceivedSignals}" >
<DataGrid.Columns>
<mui:DataGridTextColumn Header="SignalID" Binding="{Binding signalID}"/>
<mui:DataGridTextColumn Header="SignalType" Binding="{Binding signalType}"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
</UserControl>
ViewModel.cs:
private ObservableCollection<MainWindow.SignalVar> _receivedSignals;
Public ViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
public ObservableCollection<MainWindow.SignalVar> ReceivedSignals
{
get { return _receivedSignals; }
set
{
if (value != _receivedSignals)
{
_receivedSignals = value;
OnPropertyChanged("ReceivedSignals");
}
}
}
UserControl.xaml.cs:
public partial class MainSignals : UserControl
{
public MainSignals()
{
InitializeComponent();
//this.DataContext = new ViewModel(); //WORKS WITHOUT THIS??
}
}
回答:
回答№1は2これは、子コントロールが継承するという事実によるものです DataContext
彼らの親の DataContext
明示的に設定されていません。これは、一部の DependancyProperties
たとえば、親コントロールの前景を設定した場合、すべての子コントロールは前景プロパティの同じ値を継承します。
あなたの場合、あなたが設定していないので DataContext
子UserControlに対して明示的に、親のDataContextを取得します。これは、ここのWindowです。