2013-08-17 3 views
0

Я новичок в 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; 
    } 

ответ

0

В наследовании значения WPF сделано снизу вверх. Например, когда вы устанавливаете конкретный шрифт в стеке, и все дочерние элементы управления внутри панели стека будут по умолчанию иметь тот же шрифт. В вашем фрагменте с datatemplate у вас есть кнопка, привязанная к DemoClickCommand, которая является дочерней для элемента управления ListView, где ItemsSource - DemoItems. У DemoItems нет свойства под названием DemoClickCommand. Поэтому вам нужно явно указать тип предка для кнопки. Пожалуйста, попробуйте ниже XAML фрагмент кода в код DataTemplate

<Button Content="Edit" 
       BorderBrush="Black" 
       Background="Green" 
       Height="40" 
       Width="80" 
       Margin="0,20,0,0" 
       Command="{Binding Path=DemoClickCommand, Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type Window}}}}" 
       CommandParameter="{Binding ID}" /> 

Или вы можете сделать то же самое, используя BindingElementName свойства. Дайте имя для вашего ManGrid и используйте

<Button Content="Edit" 
      BorderBrush="Black" 
      Background="Green" 
      Height="40" 
      Width="80" 
      Margin="0,20,0,0" 
      Command="{Binding ElementName="MyGrid" Path=DemoClickCommand, Mode=OneWay}" 
      CommandParameter="{Binding ID}" /> 
+0

Закрыть, но не сигары. Я обнаружил, что если кнопка обернута вокруг сетки, она работает, но когда кнопка находится внутри Grid или StackPanel, она не работает. Я не хочу, чтобы весь шаблон был кнопкой, поэтому этот подход не будет работать для меня. Спасибо – jqIndy

+0

в вашем блоке уже кнопка управления внутри DataTemplate. Вы должны просто указать ElementName или AncestorType для привязки. Plese см. Мой обновленный ответ. Спасибо –

+0

Знаете ли вы, можете ли я использовать это в приложениях Windows Store? RelativeSource = {RelativeSource AncestorType = {x: Тип ListBoxItem}}} Спасибо – jqIndy

Смежные вопросы