所以这是设置。我有两种不同的WPF View 。 StandardEngineeredView和StandardEngineeredPrintView。我的StandardEngineeredViewModel中有一个名为ModelRevisionList的ObservableCollection。
我正在做的是尝试从两个不同的 View 绑定(bind)到ModelRevisionList数据源。我将 View 的数据上下文设置为相同的 View 模型。我的StandardEngineeredView中有一个按钮,可将我导航到StandardEngineeredPrintView。第二个 View 实际上仅用于允许某人打印数据。注意,我还有两个其他属性将在两个 View 的 View 模型中绑定(bind)。我只是还没有尝试这样做,因为在尝试绑定(bind)到修订列表时,出现以下错误:
相关信息
StandardEngineeredViewModel修订列表
private ObservableCollection<Revision> _ModelRevisionList = new ObservableCollection<Revision>();
public ObservableCollection<Revision> ModelRevisionList
{
get { return _ModelRevisionList; } //Error thrown here upon get
set { Set(ref _ModelRevisionList, value); }
}
绑定(bind)的 StandarEngineeredView列表框
<ListBox
BorderBrush="{StaticResource BackgroundBlueBrush}"
ItemsSource="{Binding ModelRevisionList}"
SelectedItem="{Binding SelectedRevision}"
DisplayMemberPath="Date"
Margin="70 10"
MinHeight="150"
MaxHeight="150"
ItemStringFormat="{}{0:MM/dd/yyyy}"/>
绑定(bind)的 StandardEngineeredPrintView网格 View
<Border Grid.Column="1" MaxHeight="250" MaxWidth="400" MinWidth="400">
<DataGrid ItemsSource="{Binding ModelRevisionList}" AutoGenerateColumns="False">
<DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
<DataGridTextColumn Header="Edited By" Binding="{Binding EditedBy}"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
</DataGrid>
</Border>
在两个 View 中设置的数据上下文
DataContext="{Binding StandardEngineeredViewInstance, Source={StaticResource Locator}}"
查看模型定位器
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SetupNavigation();
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view services and models
SimpleIoc.Default.Register<IDataAccessService, DataAccessService>();
}
else
{
// Create run time view services and models
SimpleIoc.Default.Register<IDataAccessService, DataAccessService>();
}
}
public StandardEngineeredViewModel StandardEngineeredViewInstance
{
get
{
SimpleIoc.Default.Register<StandardEngineeredViewModel>();
return ServiceLocator.Current.GetInstance<StandardEngineeredViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
private static void SetupNavigation()
{
SimpleIoc.Default.Unregister<IFrameNavigationService>();
var navigationService = new FrameNavigationService();
navigationService.Configure("StandardEngineeredPrintView", new Uri("/Views/EngineeringViews/StandardEngineeredPrintView.xaml", UriKind.Relative));
SimpleIoc.Default.Register<IFrameNavigationService>(() => navigationService);
}
}
现在由于该错误,我认为这与以下事实有关:在导航到StandardEngineeredPrintView之前,我在StandardEngineeredView中使用了可观察的集合。您是否可以将两个 View 绑定(bind)到同一数据源?我是在做我不知道的错误事情吗?
非常感谢您的建议,如果您想了解更多信息/代码,就这么说。
谢谢!
最佳答案
好的,解决方案非常简单。我的数据网格设置不正确。我不得不将其更改为:
<DataGrid ItemsSource="{Binding ModelRevisionList}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
<DataGridTextColumn Header="Edited By" Binding="{Binding EditedBy}"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
</DataGrid.Columns>
</DataGrid>
忘记了DataGrid.Columns
关于c# - 从两个不同的 View 绑定(bind)到数据源。 MVVM,WPF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52101882/