Привязка команды к кнопке внутри ListView с помощью Caliburn.Микро

Я пытаюсь создать что-то вроде интерфейса с вкладками MDI, поэтому у меня есть панель навигации (список) слева и ContentPresenter справа.

у меня есть ShellViewModel, который имеет BindableCollection на нем под названием AvailAbleScreens, и мне удалось успешно привязаться к этому списку с помощью Listviews DataTemplate:

<ListView x:Name="AvailableScreens">
    <ListView.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <BulletDecorator />
                <Button x:Name="DisplayView">
                    <TextBlock Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}" />
                </Button>
            </WrapPanel>
        </DataTemplate>
    </ListView.ItemTemplate>

проблема теперь в том, что, хотя имя кнопки установлено правильно, я не могу сделать команду для меня. На Класс MdiViewModel у меня есть следующий код для этой кнопки:

public bool CanDisplayView()
{
    return true;
}

public void DisplayView()
{
    MessageBox.Show("Hello");
}

все Калибурн.Микро-образцы работают с привязкой через соглашения к свойству x:Name, но если я удалю Text="{Binding}", он перестанет работать, поэтому я подозреваю, что этот способ привязки данных не работает для подмоделей?

во всяком случае, ViewModel оболочки на данный момент довольно прост:

ShellViewModel
 * AvailableScreens
    -MdiViewModel1
    -MdiViewModel2
 * CurrentActiveScreen

любая идея, как я сделаю это с Калибурном.Микро? Роб Айзенберг предложил мне Twitter Я, возможно, захочу начать с Caliburn.Micro перед тем, как войти в полноценную структуру Caliburn.

1 ответов


к сожалению, мы не можем автоматически применять соглашения к содержимому DataTemplates. Причина этого в том, что у нас нет способа перехватить механизм создания шаблона WPF/Silverlight. Чтобы обойти это, у вас есть несколько вариантов:

  1. не используйте соглашения внутри DataTemplates; используйте явные привязки и сообщения.Прикрепить вместо

  2. извлечение всех DataTemplates в UserControls, которые будут повторно enalbe соглашения через элемент UserControl. Это хорошая идея для больших шаблонов, но утомительно для маленьких

  3. использовать Bind.Model вложенное свойство в корне UIElement из DataTemplate, как это Bind.Model="{Binding}". Это приведет к тому, что соглашения будут связаны с DataTemplate. К сожалению, это может не совсем правильно из-за некоторых ошибок в Калибурн. Он работает в Калибурн.Хотя микро. Я надеюсь скоро разобраться с этим.