Привязка команды к кнопке внутри 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. Чтобы обойти это, у вас есть несколько вариантов:
не используйте соглашения внутри DataTemplates; используйте явные привязки и сообщения.Прикрепить вместо
извлечение всех DataTemplates в UserControls, которые будут повторно enalbe соглашения через элемент UserControl. Это хорошая идея для больших шаблонов, но утомительно для маленьких
использовать
Bind.Model
вложенное свойство в корнеUIElement
из DataTemplate, как этоBind.Model="{Binding}"
. Это приведет к тому, что соглашения будут связаны с DataTemplate. К сожалению, это может не совсем правильно из-за некоторых ошибок в Калибурн. Он работает в Калибурн.Хотя микро. Я надеюсь скоро разобраться с этим.