gpt4 book ai didi

wpf - WPF:使用MVVM Light将ListView放在 Accordion 中时,命令出现问题

转载 作者:行者123 更新时间:2023-12-03 10:20:00 24 4
gpt4 key购买 nike

我有这个观点:

<Grid Margin="10,0,10,10">
<StackPanel>
<wpftoolkit:Accordion
Margin="4"
HorizontalAlignment="Stretch"
Name="accordionCB"
ItemsSource="{Binding Path=ContentBlockCategories}"
SelectionMode="ZeroOrMore">
<wpftoolkit:Accordion.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch" Margin="0 0 0 4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Text="{Binding Description}"
Grid.Column="0" VerticalAlignment="Center" />
</Grid>
</DataTemplate>
</wpftoolkit:Accordion.ItemTemplate>
<wpftoolkit:Accordion.ContentTemplate>
<DataTemplate>

<!--Not Raise MouseDoubleClick Command-->

<ListView
x:Name="lvContentBlocks"
AlternationCount="2"
ItemsSource="{Binding ContentBlocks}"
IsSynchronizedWithCurrentItem="True"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<cmd:EventToCommand PassEventArgsToCommand="True" Command="{Binding Path=MouseDoubleClick}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,5">
<StackPanel VerticalAlignment="Top">
<TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</wpftoolkit:Accordion.ContentTemplate>
</wpftoolkit:Accordion>

<!--Raise MouseDoubleClick Command-->

<ListView
x:Name="lvContentBlocks"
AlternationCount="2"
ItemsSource="{Binding ContentBlockCategories}"
IsSynchronizedWithCurrentItem="True"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<cmd:EventToCommand Command="{Binding MouseDoubleClick}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,5">
<StackPanel VerticalAlignment="Top">
<TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>

而这个ViewModel:
public class MainViewModel : ViewModelBase
{
public ObservableCollection<ContentBlockCategory> ContentBlockCategories
{
get
{
return new ObservableCollection<ContentBlockCategory>
{
new ContentBlockCategory{
Id = 1,
Description = "Category 1",
ContentBlocks = new Collection<ContentBlock>
{
new ContentBlock{
Id = 1,
Description = "Content Block 1",
Text = "Text"
}
}
}
};
}
set
{
RaisePropertyChanged("ContentBlockCategories");
}
}

public RelayCommand<MouseButtonEventArgs> MouseDoubleClick
{
get;
private set;
}

public MainViewModel()
{
MouseDoubleClick = new RelayCommand<MouseButtonEventArgs>(e =>
{
DependencyObject dep = (DependencyObject)e.OriginalSource;

while ((dep != null) && !(dep is ListViewItem))
{
dep = VisualTreeHelper.GetParent(dep);
}

if (dep == null) return;

ContentBlockCategory contentBlockSelected = (ContentBlockCategory)((ListViewItem)dep).DataContext;
});
}
}

Accordion内部的第一个ListView不会在ViewModel中引发RelayCommand,但是第二个ListView会毫无问题地引发RelayCommand。

有什么问题?

问候

最佳答案

我在模板和样式中的EventToCommand遇到问题,可以在here中找到问题的示例

在这些情况下,我已移至AttachedCommandBehaviors(ACB)。该链接将您带到有关如何使用ACB的C#原理。

我的代码库中使用了它的代码片段:

            <Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<StackPanel x:Name="IconBorder"
acb:CommandBehavior.Event="PreviewMouseUp"
acb:CommandBehavior.Command="{Binding Path=DataContext.ClickCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
acb:CommandBehavior.CommandParameter="{Binding}">

关于wpf - WPF:使用MVVM Light将ListView放在 Accordion 中时,命令出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3607248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com