我有以下设计模式工作的代码,但是一旦我用真正相等的数据运行它,窗口就会显示默认类名称 DocumentViewer.ViewModel.ItemSelectorViewModel 而不是其他任何东西(不同于在设计模式)。我根本看不出问题。
public class ItemSelectorViewModel : ViewModelBase
{
private ObservableCollection<Document> _pictureSelectors;
public ItemSelectorViewModel()
{
if (Designer.IsInDesignMode())
{
string xml = System.IO.File.ReadAllText(GlobalConstants.DesignTimeDataFile);
IList<Document> list = ObjectSerializer.Deserialize<List<Document>>(xml);
PictureSelector = list.ToObservableCollection();
}
}
public ObservableCollection<Document> PictureSelector
{
get { return _pictureSelectors; }
set
{
if (_pictureSelectors == value)
{
return;
}
_pictureSelectors = value;
RaisePropertyChanged("PictureSelector");
}
}
}
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();
答案 0 :(得分:2)
您 正在替换 Window.Content
(目前设置为Grid
且名称为MyLayoutRoot
) ViewModel
当WPF去渲染视图模型对象时,它在DataTemplate
中没有看到该对象的任何.Resources
,因此它使用所有非UI对象的默认模板呈现它,这是一个TextBlock
,Text
属性设置为对象的ToString()
方法。
您可能希望在Grid
后面设置数据层而不是替换它,因此在构造函数中设置DataContext
属性而不是Content
属性
public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
InitializeComponent();
if (!Designer.IsInDesignMode())
{
DataContext = itemSelectorViewModel;
}
}