2013-04-26 17 views
6

Tôi gặp sự cố khi trình kích hoạt xuất hiện trong ViewModel SelectedItem (tham số) đến mục đã chọn trước đó. Tôi cần mục mới được chọn làm tham số trên selectionChanged.Trình kích hoạt tương tác trước khi lựa chọnThay đổi ListPicker trong Windows Phone 8

Tôi mới trong WP8. Dưới đây là mã

<toolkit:ListPicker Header="Background" 
            ExpansionMode="FullscreenOnly" 
            Template="{StaticResource ListPickerControlTemplate}" 
            VerticalAlignment="Top" 
            ItemsSource="{Binding Path=Buildings.ObjectList}" 
            Margin="0" 
            x:Name="buldings" 
            Padding="0"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="SelectionChanged"> 
          <i:InvokeCommandAction Command="{Binding Path=BuildingSelectionCommand}" 
                CommandParameter="{Binding Path=SelectedItem, ElementName=buldings}" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 

Cảm ơn Vinod

Trả lời

2

Thông thường bạn sẽ nhận được sự hiện SelectionItem truyền như tham số để chỉ huy của bạn. Kể từ khi sự kiện được viết trong quá khứ, vì vậy mà bạn sẽ nhận được SelectedItem hiện tại và không phải là trước đó.

Những gì bạn có thể thử là thêm ràng buộc cho SelectedItem vào ListPicker và bỏ qua SelectedItem vào tham số Command as.

<toolkit:ListPicker SelectedItem="{Binding SelectedBuilding, Mode=TwoWay}" > 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding Path=BuildingSelectionCommand}"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</toolkit:ListPicker> 

lệnh của bạn sau đó cần phải truy cập vào SelectedBuilding tài sản để thực hiện

public class BuildingSelectionCommand{ 

     // a reference to your ViewModel that contains the SelectedBuilding-Property 
     public BuildingsViewModel ViewModel { 
     get; 
     set; 
     } 

     public bool CanExecute(object parameter) { 
     return ViewModel.SelectedBuilding != null; 
     } 

     public void Execute(object parameter){ 
     var selectedItem = ViewModel.SelectedBuilding; 

     // execute command logic with selectedItem 
     } 
    } 

Mã này có thể được khác nhau về phía bạn, vì nó phụ thuộc vào cách bạn đã thực hiện ViewModel và Command của bạn, nhưng tôi nghĩ rằng bạn nên nhận nó.

Cách khác mà không cần sử dụng EventTrigger, là thực thi lệnh trực tiếp trong thuộc tính SelectedBuilding-Property của bạn.

public Building SelectBuilding{ 
    get { 
     return _selectedBuilding 
    } 
    set{ 
     _selectedBuilding = value; 
     RaisePropertyChanged("SelectedBuilding"); 

     if (BuildingSelectionCommand.CanExecute(_selectedBuilding)) { 
     BuildingSelectionCommand.Execute(_selectedBuilding); 
     } 
    } 
+0

Tôi không tìm thấy SelectedItemChanged là sự kiện của ListPicker. Và tôi đã thử mã trên và nó không hoạt động. Nó không bị sa thải. – vinod8812

+0

@ vinod8812 chính xác, ListPicker chỉ có sự kiện SelectionChanged. Đó là lỗi của tôi. Tôi đã cập nhật câu trả lời của mình để cung cấp một giải pháp khác – Jehof

+0

Tôi không nghĩ rằng điều này sẽ làm việc như tôi muốn thực hiện một phương pháp async. Không cách nào tôi có thể thực hiện một phương thức async. – vinod8812

1

Cách đơn giản để giải quyết nó là sử dụng

SelectedItem="{Binding SelectedBuilding, Mode=TwoWay}" 

như Jehof đề xuất và thoát khỏi tất cả các "<i:" Cài đặt kích hoạt nhưng chỉ đơn giản là xử lý sự thay đổi trong setter tài sản SelectedBuilding và gọi một thay vì sử dụng các lệnh để bọc một cuộc gọi phương thức. Bạn không đạt được bất cứ điều gì với một lệnh kể từ khi bạn thậm chí không sử dụng CanExecute ở đây, nhưng chỉ cần thêm mã nhiều hơn nữa.

+0

dude tôi không thể sử dụng sự kiện thay đổi thuộc tính để gọi các phương thức nặng mà các phương thức không đồng bộ – vinod8812

+0

@ vinod8812 Tôi thực sự không biết vấn đề của bạn là gì, bạn nhận được 2 câu trả lời ngay bây giờ và bạn luôn nói về các phương thức async của mình. Câu hỏi của bạn là, bạn luôn nhận được thông tin sai mục được truyền dưới dạng tham số cho lệnh của bạn. Bạn nên cập nhật câu hỏi của mình để cung cấp thêm thông tin hoặc bạn nên trả lời một câu hỏi khác – Jehof

+0

Bạn không sử dụng PropertyChanged tại đây. Tôi nghĩ rằng bạn có một sự hiểu lầm về những gì các phương pháp async được. Bạn có thể gọi một phương thức async từ SetBuilding setter và đó là nó. –

2

XAML:

<i:EventTrigger EventName="SelectionChanged"> 
    <command:EventToCommand Command="{Binding BuildingSelectionCommand}" PassEventArgsToCommand="True"/> 
</i:EventTrigger> 

Command:

RelayCommand<SelectionChangedEventArgs> BuildingSelectionCommand { get; set; } 

BuildingSelectionCommand = new RelayCommand<SelectionChangedEventArgs>(async (args) => { }); 

Bạn chỉ cần bỏ lỡ "PassEventArgsToCommand". Hãy chắc chắn rằng lệnh của bạn có một SelectionChangedEventArgs.

+0

Khi đọc các câu trả lời khác, tôi không thực sự chắc chắn câu hỏi/vấn đề của bạn là gì. – SBoss

Các vấn đề liên quan