2013-04-26 20 views
6

ViewModel'de tetiklendiğinde bir sorunum var SelectedItem (parametre) önceden seçilmiş Öğe olarak gelir. Yeni seçilen öğeye selectionChanged'de parametre olarak ihtiyacım var.Etkileşim Seçmeden önce tetikleme Windows Phone'da Liste Seçici'nin Değiştirilmesi 8

WP8'de yeni. Aşağıda

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

Teşekkür Vinod

cevap

2

Normalde şu anda Komutanlığı'na parametre olarak geçirilen SelectionItem almalısınız koddur. Etkinlik geçmiş zamana göre yazıldığından, şu anda SelectedItem'i almalı ve önceden bir tane almamalısınız.

SelectedItem için ListPicker'ınıza bir ciltleme eklemeyi ve SelectedItem komutunu Komut parametrenize aktarmayı atlamayı deneyebilirsiniz.

<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> 
hakimiyetin o zaman, size ViewModel ve Komut uygulayan bağlıdır çünkü, sizin tarafta fark bulunamamıştır edilebilir

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

kodların çalıştırılması mülkiyet SelectedBuilding erişmesi gereken fakat

bence almalısın.

Bir EventTrigger kullanmadan başka bir yol, doğrudan SelectedBuilding-Property'ınızda komutu yürütmektir. Jehof önerdi ve tüm "<i:" tetik ayarlarından kurtulmak ancak sadece SelectedBuilding mülkiyet setter değişikliği işlemek ve bir çağrı olarak

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

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

SelectedItemChanged öğesini ListPicker olayı olarak bulamadım. Ve kodun üzerinde denedim ve işe yaramadı. Onun kovulmaması. – vinod8812

+0

@ vinod8812 doğru, ListPicker'ın yalnızca SelectionChanged-Event'i var. bu benim hatam. Başka bir çözüm daha sağlamak için cevabımı güncelledim – Jehof

+0

Bir async yöntemi yürütmek istediğim gibi çalışacağını düşünmüyorum. Her iki durumda da bir async yöntemini çalıştırabilirim. – vinod8812

1

bunu çözmek için basit bir yol

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

kullanmaktır yöntem çağrısı sarmak için komutları kullanmak yerine yöntem. Komutla hiçbir şey kazanmıyorsunuz, çünkü burada CanExecute'u kullanmıyorsunuz, ancak sadece daha fazla kod ekliyorsunuz.

+0

ahbabı çoktan değiştirilmiş olayı kullanamıyorum olayları ağır yöntemlerle çağırmak için çok zor metotlar – vinod8812

+0

@ vinod8812 Gerçekten bilmiyorum senin sorunun ne, şimdi 2 cevap alırsın ve her zaman asenkron metodlarından bahsederdin. Sorunuz, komutunuza parametre olarak yanlış öğeyi her zaman iletmenizle ilgilidir. Daha fazla bilgi sağlamak için sorunuzu güncellemelisiniz veya başka bir soruya cevap vermelisiniz – Jehof

+0

Burada PropertyChanged'i kullanmıyorsunuz. Async yöntemlerinin ne olduğu konusunda bir yanlış anlaşılma olduğunu düşünüyorum. SelectedBuilding ayarlayıcısından bir async yöntemini çağırabilirsiniz ve işte bu kadar. –

2

XAML:

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

Komut:

RelayCommand<SelectionChangedEventArgs> BuildingSelectionCommand { get; set; } 

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

Sadece "PassEventArgsToCommand" cevapsız. Komutunuzun bir SelectionChangedEventArgs olduğundan emin olun.

+0

Diğer cevapları okuduktan sonra, sorunun/sorunun ne olduğundan emin değilim. – SBoss