/ /複数のWindows / Pages / ControlsでDataContextを設定する方法は? -c#、wpf、バインディング、データコンテキスト

複数のWindows /ページ/コントロールでDataContextを設定するには? - c#、wpf、バインディング、datacontext

私はWPF MVVMがどのように機能するかについて質問がありますオンラインのチュートリアルのほとんどは、単一のウィンドウを使用して例を示しているようですので、複数のウィンドウ/ページ/ユーザーコントロールでこれを正しく実行しているかどうかはわかりません。

という名前のクラスがある場合 ViewModel 私は DataContextMainWindow 以下のコードを使用して、 DataContextMainWindow のみ。

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です。