Вопрос Caliburn.Micro: XamlParseException Не удается установить неизвестный элемент '{clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro}View.Model'

Я получаю действительно странное исключение XamlParseException, и я понятия не имею, почему.

Сообщение «Невозможно установить неизвестный член« {clr-namespace: Caliburn.Micro; сборка = Caliburn.Micro} View.Model ».

В модели представления у меня есть ObservableCollection, которую я инициализирую в конструкторе следующим образом:

internal class EntityListScreenViewModel : Screen
{
    public EntityListScreenViewModel()
    {
        var list = new List<Entity>() { new Entity() { Name = "Joe" } };
        this.Entities = new ObservableCollection<Entity>(list);
    }

    public ObservableCollection<Entity> Entities { get; set; }
}

Вот вид:

<Window x:Class="WpfApp.EntityListScreenView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="350" Width="525">
    <Grid>
        <ListBox x:Name="Entities"/>
    </Grid>
</Window>

Когда я вызываю WindowManager.ShowWindow() для экземпляра EntityListScreenViewModel, я получаю исключение.

Если я не добавляю объект в список (используя вместо этого var list = new List<Entity>();), я не получаю исключение.

У кого-нибудь есть идеи?

Обновление:

Я попытался изменить ObservableCollection на строку типа и добавил одну строку, но не получил исключения. Я подозреваю, что Caliburn.Micro каким-то образом ищет представление для представления Entity в ListBox. Может быть, это то, что происходит?

Обновление 2:

Наконец-то я понял, что на самом деле происходит... DefaultItemTemplate в ConventionManager имел некоторый проанализированный Xaml, который искал сборку "Caliburn.Micro", но я поместил код с другой сборкой. Изменил Xaml и проблема ушла.


person Adam W. McKinley    schedule 14.05.2011    source источник


Ответы (2)


Я подозреваю, что Caliburn.Micro каким-то образом ищет представление для представления Entity в ListBox.

Да, это то, что происходит. По умолчанию, когда вы привязываете список, используя соглашение об именах, Caliburn Micro интерпретирует это как привязку к списку ViewModels; не список сущностей. Это позволяет вам привязываться к списку ViewModels без необходимости указывать конкретное представление для использования в ItemTemplate из ItemsControl, и в итоге вы получаете список представлений, специфичных для этой ViewModel.

Чтобы этого не произошло, вы должны иметь возможность просто вручную привязываться к ListBox. Если Caliburn Micro уже видит привязку ItemsSource, она проигнорирует это соглашение.

<ListBox x:Name="Entities" ItemsSource="{Binding Entities}"/>
person Joe McBride    schedule 16.05.2011
comment
Спасибо за помощь Джо! Я действительно понял, что ошибка была вызвана неправильным именем сборки: см. последнее обновление для вопроса. - person Adam W. McKinley; 18.05.2011

Я не уверен, но вы можете попробовать поместить EntityListScreenView в пространство имен Views и EntityListScreenViewModel в пространство имен ViewModels - конечно, если вы используете "стандартный" класс Bootstrapper.

person Rafal Spacjer    schedule 16.05.2011