Я новичок в winRT и много борется с этим.CommandParameter не работает в ListView
Я создал DemoViewModel, в котором объявляю DemoClickCommand, как показано ниже. Команда имеет тип DelegateCommand.
public DelegateCommand DemoClickCommand { get; private set; }
protected virtual void OnClickCommandExecuted(object parameter)
{
var obj = parameter;
}
protected virtual bool OnClickCommandCanExecute(object parameter)
{
return true;
}
public DemoViewModel()
{
this.DemoClickCommand = new DelegateCommand(this.OnClickCommandExecuted, this.OnClickCommandCanExecute);
}
Я вразумлял эту команду для кнопки на моей форме, которая прекрасно работает самостоятельно, но не работает, когда они содержатся в ListView, который использует DataTemplate.
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<!-- THIS BUTTON WORKS FINE-->
<Button Content="Button"
HorizontalAlignment="Left"
Height="143"
Margin="1354,424,0,0"
VerticalAlignment="Top"
Width="307"
Background="#FFC11A1A"
FontSize="36"
Command="{Binding DemoClickCommand, Mode=OneWay}" />
<!-- THIS LISTVIEW WHICH USES THE DATATEMPLATE WONT WORK -->
<ListView x:Name="lvDemoItems"
SelectionChanged="lvDemoItems_SelectionChanged"
Grid.Column="0"
Margin="0,140,0,0"
ItemTemplate="{StaticResource DemoTemplate}"
ItemsSource="{Binding DemoItems}"
SelectionMode="Single"
HorizontalAlignment="Left"
Width="904">
</ListView>
</Grid>
Это шаблон данных, определенный в моих странице ресурсах
<Page.Resources>
<DataTemplate x:Name="DemoTemplate">
<Grid Height="110"
Width="480"
Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}"
Width="110"
Height="110">
<Image Source="{Binding ImageURI}"
Stretch="UniformToFill"
AutomationProperties.Name="{Binding Title}" />
</Border>
<StackPanel Grid.Column="1"
VerticalAlignment="Top"
Margin="10,0,0,0">
<TextBlock Text="{Binding Name}"
Style="{StaticResource TitleTextStyle}"
TextWrapping="NoWrap" />
<TextBlock Text="{Binding Description}"
Style="{StaticResource BodyTextStyle}"
MaxHeight="160" />
<Button Content="Edit"
BorderBrush="Black"
Background="Green"
Height="40"
Width="80"
Margin="0,20,0,0"
Command="{Binding DemoClickCommand, Mode=OneWay}"
CommandParameter="{Binding ID}" />
</StackPanel>
</Grid>
</DataTemplate>
</Page.Resources>
Я думаю, что нужно использовать Прикрепленное свойство зависимостей, но не знает, как это реализовать.
Это то, что у меня есть до сих пор, но я не уверен, как заставить его работать. Не могли бы вы помочь и объяснить это? Спасибо
public ICommand DemoClickCommand { get; private set; }
public static readonly DependencyProperty DemoClickCommand =
DependencyProperty.RegisterAttached("DemoClickCommand", typeof(ICommand), typeof(Button), new PropertyMetadata(null, OnItemCommandPropertyChanged));
private static void OnClickCommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ICommand command = e.NewValue as ICommand;
}
Закрыть, но не сигары. Я обнаружил, что если кнопка обернута вокруг сетки, она работает, но когда кнопка находится внутри Grid или StackPanel, она не работает. Я не хочу, чтобы весь шаблон был кнопкой, поэтому этот подход не будет работать для меня. Спасибо – jqIndy
в вашем блоке уже кнопка управления внутри DataTemplate. Вы должны просто указать ElementName или AncestorType для привязки. Plese см. Мой обновленный ответ. Спасибо –
Знаете ли вы, можете ли я использовать это в приложениях Windows Store? RelativeSource = {RelativeSource AncestorType = {x: Тип ListBoxItem}}} Спасибо – jqIndy