C# 将ObservableCollection绑定到子窗口,设计模式有效,实际数据无效
我有以下代码,其中设计模式起作用,但当我使用真正相等的数据运行它时,窗口只显示默认的类名DocumentViewer.ViewModel.ItemSelector ViewModel,没有其他内容(与设计模式不同)。我根本看不出问题所在 视图模型 XAML 您正在用您的C# 将ObservableCollection绑定到子窗口,设计模式有效,实际数据无效,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我有以下代码,其中设计模式起作用,但当我使用真正相等的数据运行它时,窗口只显示默认的类名DocumentViewer.ViewModel.ItemSelector ViewModel,没有其他内容(与设计模式不同)。我根本看不出问题所在 视图模型 XAML 您正在用您的视图模型替换窗口。内容(当前设置为网格,名称为MyLayoutRoot) 当WPF去渲染视图模型对象时,它在其.Resources中看不到该对象的任何DataTemplate,因此它使用所有非UI对象的默认模板来渲染它,这是一个T
视图模型替换窗口。内容(当前设置为网格,名称为MyLayoutRoot
)
当WPF去渲染视图模型对象时,它在其.Resources
中看不到该对象的任何DataTemplate
,因此它使用所有非UI对象的默认模板来渲染它,这是一个TextBlock
,其Text
属性设置为对象的ToString()
方法
您可能希望在网格
后面设置数据层,而不是替换它,因此在构造函数中设置DataContext
属性,而不是Content
属性
public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
InitializeComponent();
if (!Designer.IsInDesignMode())
{
DataContext = itemSelectorViewModel;
}
}
Thx Rachel,这就是解决方案!我确信这一定是件小事,但我根本没看到。显示设计时间和实时数据现在就像一种魅力。
public partial class ItemSelectorView
{
public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
InitializeComponent();
if (!Designer.IsInDesignMode())
{
Content = itemSelectorViewModel;
}
}
}
<Window x:Class="DocumentViewer.View.ItemSelectorView"
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:viewModel="clr-namespace:DocumentViewer.ViewModel"
Title="ItemSelector"
Width="300"
Height="321"
WindowStyle="SingleBorderWindow"
d:DataContext="{d:DesignInstance Type=viewModel:ItemSelectorViewModel,
IsDesignTimeCreatable=True}"
mc:Ignorable="d">
<Window.Resources />
<Grid x:Name="MyLayoutRoot"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20*" />
</Grid.ColumnDefinitions>
<DataGrid x:Name="MyDataGrid"
Width="Auto"
Height="Auto"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
AutoGenerateColumns="False"
CanUserAddRows="False"
ItemsSource="{Binding Path=PictureSelector}"
SelectedCellsChanged="Item_SelectionChanged"
SelectedValuePath="DocId"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding DocNumber}" Header="Tagesnummer" />
<DataGridTextColumn Binding="{Binding GraphicType}" Header="Grafiktyp" />
<DataGridTextColumn Binding="{Binding DocId}" Header="Doc ID" />
</DataGrid.Columns>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="FontWeight" Value="Bold" />
</Style>
</DataGrid.ColumnHeaderStyle>
</DataGrid>
</Grid>
ItemSelectorViewModel viewModel = new ItemSelectorViewModel();
viewModel.PictureSelector = _dataModel.DokumenteItems;
ItemSelectorView view = new ItemSelectorView(viewModel);
view.Owner = Application.Current.MainWindow;
view.Show();
public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
InitializeComponent();
if (!Designer.IsInDesignMode())
{
DataContext = itemSelectorViewModel;
}
}