Я использую Caliburn Micro Message.Attach через XAML, чтобы попытаться связать события с моделью представления, но я не могу запустить событие TreeViewItem.Expanded
. Другие события, такие как SetSelectedItem
, работают нормально.
Я нашел другой вопрос по этому вопросу на SO здесь , но это не помогло в моем случае, поскольку не было предоставлено никакого контекста для ответа.
Единственная другая информация, которую я могу найти, - это следующий GitHub выпуск .
Внутренне Caliburn.Micro превращает <Button cm:Message.Attach="[Event Click] = [Action Test]" />
в
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cm:ActionMessage MethodName="Test" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Как вы заметили, EventTrigger не поддерживает вложенные события. При быстром осмотре всплыло Как подключить MVTM EventToCommand к событию Attached , которое показывает, как создать RoutedEventTrigger, который можно подключить к полному синтаксису.
Опять я попробовал этот подход, но не до конца понимаю, как это реализовать. Он запускает событие в пользовательском классе, но никогда не передается моему обработчику в модели представления.
Вот мой XAML (без предложения GitHub):
<TreeView x:Name="FolderView"
cal:Message.Attach="[Event TreeViewItem.Expanded] = [Action Expanded($this)];
[Event SelectedItemChanged] = [Action SetSelectedItem($this.SelectedItem)]">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type models:LogicalDriveItem}"
ItemsSource="{Binding Directories}" >
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=DriveLetter}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type models:DirectoryItem}"
ItemsSource="{Binding Directories}">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=Path}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
И мой посмотреть код модели:
public void Expanded(object sender, RoutedEventArgs e)
{
// This won't fire
}
public void Expanded(object sender)
{
// Or this
}
public void SetSelectedItem(object sender)
{
// But this will
}