ReadOnlyObservableCollection <T>в данных времени проектирования WPF - PullRequest
0 голосов
/ 19 марта 2019

У меня есть ViewModel со свойством ReadOnlyObservableCollection .Определено что-то вроде этого:

public class MyViewModel
{
    private ObservableCollection<string> myProtectedCollection;

    public ReadOnlyObservableCollection<string> MyCollectionProperty { get; }

    public MyViewModel()
    {
        this.myProtectedCollection = new ObservableCollection<string>();
        this.MyCollectionProperty = new ReadOnlyObservableCollection<string>(this.myProtectedCollection);
        this.myProtectedCollection.Add("String1");
        this.myProtectedCollection.Add("String2");
        this.myProtectedCollection.Add("String3");
    }
}

Затем я создал файл xaml с именем TestData.xaml и установил действие сборки в DesignData.В этом у меня есть это:

<local:MyViewModel 
    xmlns:local="clr-namespace:ScrapWpfApplication1"
    xmlns:system="clr-namespace:System;assembly=mscorlib">
    <local:MyViewModel.MyCollectionProperty>
        <system:String>String 1</system:String>
        <system:String>String 2</system:String>
    </local:MyViewModel.MyCollectionProperty>
</local:MyViewModel>

Наконец, у меня есть MainWindow.xaml со следующим:

<Window x:Class="ScrapWpfApplication1.MainWindow"
        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:local="clr-namespace:ScrapWpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        d:DataContext="{d:DesignData Source=SampleData.xaml}">
    <ListBox ItemsSource="{Binding MyCollectionProperty}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

Проблема в том, что это не показывает мои образцы данных в Visual Studioдизайнер.Если я изменю коллекцию в моей модели представления на ObservableCollection вместо ReadOnlyObservableCollection, то она будет работать как указано.

Полагаю, это потому, что система данных времени разработки создает фиктивную коллекцию ReadOnlyCollection, но XAML не может ее заполнить, потому что она доступна только для чтения.

Есть ли способ получить данные типа проектасистема работает без записи свойства коллекции моей модели представления?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Я не видел идеального ответа на это. Но это то, что я наконец-то сделал.

Вместо того, чтобы пытаться заставить систему данных проектирования издеваться над коллекцией только для чтения. Я создал новый набор примеров данных только для коллекции и заставил MainWindow.xaml взглянуть на это.

Так что мой файл TestData.xaml меняется только на это. На самом деле в нем больше, но это всего лишь пример для этого вопроса, поэтому он выглядит довольно пустым.

<local:MyViewModel 
    xmlns:local="clr-namespace:ScrapWpfApplication1"
    xmlns:system="clr-namespace:System;assembly=mscorlib">
</local:MyViewModel>

Во-вторых, я создал второй файл тестовых данных с именем TestDataArray.xaml с массивом в нем. Обязательно установите для действия сборки значение DesignData.

<x:Array Type="system:String"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    xmlns:local="clr-namespace:ScrapWpfApplication1"
    xmlns:system="clr-namespace:System;assembly=mscorlib">
    <system:String>String 1</system:String>
    <system:String>String 2</system:String>
</x:Array>

Наконец я изменил свой файл MainWindow.xaml на этот. Обратите внимание на изменение привязки на

<Window x:Class="ScrapWpfApplication1.MainWindow"
        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:local="clr-namespace:ScrapWpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        d:DataContext="{d:DesignData Source=SampleData.xaml}">
    <ListBox ItemsSource="{Binding}" DataContext="{Binding MyCollectionProperty}" d:DataContext="{d:DesignData Source=SampleDataArray.xaml}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

Это работает для моего конкретного сценария, но оно может упасть, если образцы данных были привязаны к элементу управления, а ReadOnlyCollection читалось чем-то внутри этого элемента управления.

1 голос
/ 19 марта 2019

Есть ли способ заставить систему данных типа проекта работать без записи свойства коллекции моей модели представления?

Да, вы можете создать другой класс модели представления, который будет использоваться только для целей проектирования, со свойством ObservableCollection<T> и установить для времени проектирования DataContext представления его экземпляр:

d:DataContext="{d:DesignInstance Type=local:DesignTimeViewModel, IsDesignTimeCreatable=True}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...