Привязать команду к кнопке внутри ListView с помощью Caliburn.Micro - PullRequest
12 голосов
/ 06 сентября 2010

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

У меня есть ShellViewModel, которая имеет BindableCollectionна нем он называется «ДоступныеСкриншоты», и мне удалось успешно связать этот список с помощью шаблона данных ListViews:

<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");
}

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

В любом случае, ViewModel в Shell на данный момент довольно прост:

ShellViewModel
 * AvailableScreens
    -MdiViewModel1
    -MdiViewModel2
 * CurrentActiveScreen

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

1 Ответ

20 голосов
/ 06 сентября 2010

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

  1. Не использовать соглашения внутри DataTemplates;Вместо этого используйте явные привязки и Message.Attach

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

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

...