2012-12-27 14 views
6
<StackPanel> 
     <!--<Button Command="{Binding GetOddsCommand}" CommandParameter="{Binding}" />--> 

    <ListView 
     ItemsSource="{Binding Links}" 
     > 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Border> 
        <Button Command="{Binding GetOddsCommand}" CommandParameter="{Binding}"> 
         <TextBlock > 
         <Hyperlink NavigateUri="http://www.onet.pl" > 
          <TextBlock Text="{Binding}" /> 
         </Hyperlink> 
        </TextBlock> 
        </Button> 
       </Border> 
      </DataTemplate> 
     </ListView.ItemTemplate> 

Mam aplikację MVVM. W ViewModel mam GetOddsCommand:Przycisk WPF w ListView nie widzi polecenia w ViewModel

public ICommand GetOddsCommand 
{ 
    get 
    { 
     if (_getOddsCommand == null) 
      _getOddsCommand = new RelayCommand(param => GetOdds()); 
     return _getOddsCommand; 
    } 
} 

private void GetOdds() 
{ 

} 

Kiedy odkomentowaniu pierwszy przycisk dowództwo StackPanel działa dobrze. Debugger krok do get, a następnie po kliknięciu polecenia krok debugowania do metody GetOdds. Ale nie działa w drugim przycisku, który znajduje się w ListView. Wygląda drugiego przycisku nie widzę GetOddsCommand, ale nie rozumiem, dlaczego

Dzięki

Odpowiedz

11

Umieszczenie przycisku i wewnątrz niego hiperłącze nie ma sensu ... Czego można się spodziewać się dziać po kliknięciu na hiperłącze?
Anyways, następujący kod spowoduje, że komenda na miano:

<ListView ItemsSource="{Binding Links}" x:Name="ListView1"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Border> 
        <Button Command="{Binding ElementName=ListView1, Path=DataContext.GetOddsCommand}" CommandParameter="{Binding}"> 
         <TextBlock Text="{Binding}" /> 
        </Button> 
       </Border> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 

Wskazówka DataContext wykorzystywane jest to, że ListView nie z ListViewItem ...
Może chcesz zrobić tego samego rodzaju wiązania dla CommandParameter - Zależy od tego, co naprawdę chcesz.

Dodanie hiperłącza do środka spowoduje problemy - jeśli klikniesz hiperłącze, przycisk nie zostanie kliknięty, więc nie otrzymasz polecenia, jeśli klikniesz na obszar bez hiperłącza, wszystko będzie dobrze. ..

Jeśli naprawdę chcesz , czy ma hiperłącze ... Możesz ustawić wartość IsHitTestVisible otaczającego bloku tekstu na wartość fałsz.

np .:

<TextBlock IsHitTestVisible="false"> 
    <Hyperlink NavigateUri="http://www.onet.pl" > 
    <TextBlock Text="{Binding}" /> 
</TextBlock> 
7

To dlatego, że są wiążące polecenia w innym kontekście danych.

W StackPanel wiążisz polecenie w bieżącym kontekście danych, który prawdopodobnie jest modelem widoku zawierającym polecenie.

W ListView, wiążisz polecenie w innym kontekście danych, który jest bieżącym elementem listy, który moim zdaniem jest obiektem Link, który prawdopodobnie nie posiada polecenia.

Jeśli chcesz, aby polecenie miało takie samo zachowanie, jak w twoim StackPanelu, wystarczy nadać nazwę widoku listy i wprowadzić powiązanie w kontekście danych ListView zamiast kontekstu danych ListViewItem.

<ListView x:Name="linksListView" ItemsSource="{Binding Links}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Border> 
       <Button Command="{Binding DataContext.GetOddsCommand, ElementName=linksListView}" 
         CommandParameter="{Binding DataContext, ElementName=linksListView}"> 
        <TextBlock> 
         <Hyperlink NavigateUri="http://www.onet.pl" > 
          <TextBlock Text="{Binding}" /> 
         </Hyperlink> 
        </TextBlock> 
       </Button> 
      </Border> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

Nie działa z ElementName też Mayby somethink z RelativeSoure będzie helpfoul? – Robert

+0

Niestety zapomniałem DataContext w powiązaniu. Poprawione. – Ucodia

+1

Kolejny plakat daje tę samą odpowiedź później i zostaje zatwierdzony? – Ucodia

Powiązane problemy