绑定ObservableCollection到子窗口,设计模式工作,实际数据没有

时间:2013-05-06 15:21:05

标签: c# wpf mvvm mvvm-light

我有以下设计模式工作的代码,但是一旦我用真正相等的数据运行它,窗口就会显示默认类名称 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;
        }
    }
}

XAML

<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>

我使用RelayCommand

从父母那里调用孩子
ItemSelectorViewModel viewModel = new ItemSelectorViewModel();
viewModel.PictureSelector = _dataModel.DokumenteItems;
ItemSelectorView view = new ItemSelectorView(viewModel);
view.Owner = Application.Current.MainWindow;
view.Show();

1 个答案:

答案 0 :(得分:2)

正在替换 Window.Content(目前设置为Grid且名称为MyLayoutRootViewModel

当WPF去渲染视图模型对象时,它在DataTemplate中没有看到该对象的任何.Resources,因此它使用所有非UI对象的默认模板呈现它,这是一个TextBlockText属性设置为对象的ToString()方法。

您可能希望在Grid后面设置数据层而不是替换它,因此在构造函数中设置DataContext属性而不是Content属性

public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
    InitializeComponent();

    if (!Designer.IsInDesignMode())
    {
        DataContext = itemSelectorViewModel;
    }
}