0

デザインモードが機能する次のコードがありますが、実際に等しいデータで実行するとすぐに、ウィンドウにはデフォルトのクラス名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();
4

1 に答える 1

2

(現在、 の名前の に設定 されています) をあなたのWindow.ContentGridMyLayoutRootViewModel

WPF がビュー モデル オブジェクトをレンダリングしようとすると、DataTemplateそのオブジェクトが に表示されないため、.ResourcesUI 以外のすべてのオブジェクトの既定のテンプレートを使用してレンダリングします。これはTextBlockTextプロパティToString()がオブジェクトのメソッドに設定されている.

おそらく、データレイヤーGridを置き換えるのではなく、背後に設定する必要があるため、コンストラクターでDataContextプロパティの代わりにプロパティを設定しますContent

public ItemSelectorView(ItemSelectorViewModel itemSelectorViewModel)
{
    InitializeComponent();

    if (!Designer.IsInDesignMode())
    {
        DataContext = itemSelectorViewModel;
    }
}
于 2013-05-06T15:24:49.910 に答える