2012-12-27 8 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> 

Tôi có ứng dụng MVVM. Trong chế độ xem, tôi có GetOddsCommand:Nút WPF trong ListView không thể nhìn thấy lệnh trong ViewModel

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

private void GetOdds() 
{ 

} 

Khi tôi bỏ ghi chú nút đầu tiên được đặt trong lệnh StackPanel hoạt động tốt. Debugger bước vào nhận được và sau đó khi tôi nhấp vào lệnh Debugger bước vào GetOdds phương pháp. Nhưng nó không hoạt động ở nút thứ hai trong ListView. Trông giống như nút thứ hai không thể nhìn thấy GetOddsCommand, nhưng tôi không hiểu tại sao

Cảm ơn

Trả lời

11

Đặt nút và bên trong siêu liên kết không có ý nghĩa gì ... Bạn mong đợi điều gì xảy ra khi bạn nhấp vào liên kết?
Anyways, đoạn code sau sẽ gây ra lệnh của bạn được gọi là:

<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> 

Thông báo DataContext sử dụng là của ListView không của ListViewItem ...
Bạn có thể muốn làm cùng loại ràng buộc cho CommandParameter - Phụ thuộc vào những gì bạn đang thực sự sau.

Bây giờ, thêm siêu kết nối bên trong sẽ gây ra vấn đề - nếu bạn bấm vào siêu liên kết thì nút này không thực sự được bấm để bạn không nhận được lệnh, nếu bạn bấm vào vùng không có siêu liên kết, mọi thứ sẽ ổn. ..

Nếu bạn thực sự làm muốn siêu liên kết ở đó ... Bạn có thể đặt IsHitTestVisible của khối chữ bao quanh thành sai.

ví dụ .:

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

Đó là bởi vì bạn đang ràng buộc các lệnh trong một bối cảnh dữ liệu khác nhau.

Trong StackPanel, bạn đang ràng buộc lệnh trong ngữ cảnh dữ liệu hiện tại có lẽ là mô hình khung nhìn của bạn đang giữ lệnh.

Trong ListView, bạn đang ràng buộc lệnh trên ngữ cảnh dữ liệu khác là mục danh sách hiện tại mà tôi tin là đối tượng Liên kết có thể không giữ lệnh.

Nếu bạn muốn lệnh có hành vi tương tự như trong StackPanel, chỉ cần đặt tên cho chế độ xem danh sách và tạo liên kết trên ngữ cảnh dữ liệu ListView thay vì ngữ cảnh dữ liệu 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

Không làm việc với ElementName quá, Mayby somethink với RelativeSoure sẽ helpfoul? – Robert

+0

Xin lỗi quên DataContext trong ràng buộc. Đã sửa. – Ucodia

+1

Một áp phích khác cho cùng một câu trả lời sau và được xác thực? – Ucodia