2011-11-08 20 views
5

Bir ObservableCollection öğesine bağlı bir ListView ItemsSource var. ListView.SelectedItem'i izlemek için MVVM aracılığıyla bir özellik ekledim. ObservableCollection öğesindeki her nesne ile ilgili verileri görüntüleyen bir düğme komutu oluşturmak için ListView'üme (GridViewColumn.CellTemplate aracılığıyla) bir düğme eklendi. Bu yüzden benim ObservableCollection (ListView sütun 1) içindeki nesnelerin listesi, ListView'de karşılık gelen bir düğmeyle (ListView sütun 2) gösterilir.Düğme ListView.SelectedItem ile ilişkilendirme

Kurallar harika çalışıyor! Tek sorun: Kullanıcı listesindeki karşılık gelen düğmeye tıklamadan önce ListView satırını tıklamanız gerekir. (Kullanıcı ilk önce ListView satırını tıklamadan düğmeyi tıklarsa, "SelectedFromQueue" özelliğimde boş bir başvuru istisnası alıyorum.)

Düğme tıklandığında ListView.SelectedItem özelliğini ayarlayan bir kod eklemek istiyorum. Dolayısıyla, kullanıcı bir düğmeyi tıklatırsa, ilgili MVVM komutu yürütülmeden önce kodun ListView.SelectedItem özelliği bağlanmasını güncelleştirmesi gerekir.

Bunun için herhangi birinin örnek kodu var mı? Yardım ettiğin için teşekkür ederim.

Benim XAML:

<UserControl xmlns:local="clr-namespace:MyApp" 
      x:Class="MyApp.QueueObjectList" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" Height="290" Width="320"> 

    <Grid Width="319"> 
     <GroupBox Header="Queue Class List" HorizontalAlignment="Left" Width="319" BorderBrush="Black" BorderThickness="2"> 
      <ListView ItemsSource="{Binding Path=QueueList}" Name="QueueListView"> 
       <ListView.SelectedItem> 
        <Binding Path="SelectedFromQueue" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
        </Binding>    
       </ListView.SelectedItem> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="140" Header="Queue Name" DisplayMemberBinding="{Binding Name}" /> 
         <GridViewColumn Width="179" Header="Property Information"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
            <Button Content="Get Property Info" Command="{Binding Path=GetQueueObjProperties}" 
             DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />      
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
         </GridViewColumn> 
        </GridView> 
       </ListView.View> 
      </ListView> 
     </GroupBox> 
    </Grid> 
</UserControl> 

Benim MainWindowViewModel C# Kod:

private ObservableCollection<Queue> _QueueList; 
private Queue _selectedFromQueue; 

public ObservableCollection<Queue> QueueList 
{ 
    get { return _QueueList; } 
    set 
    { 
     _QueueList = value; 
     RaisePropertyChanged("QueueList"); 
    } 
} 

public Queue SelectedFromQueue 
{ 
    get { return _selectedFromQueue; } 
    set 
    { 
     _selectedFromQueue= value; 
     RaisePropertyChanged("SelectedFromQueue"); 
    } 
} 

// Constructor 
public MainWindowViewModel() 
{ 
    QueueList = new ObservableCollection<Queue>(); 
    _selectedFromQueue= null; 
} 

public ICommand GetQueueObjProperties 
{ 
    get { return new RelayCommand(GetQueueProperties, CanGetQueueProperties); } 
} 

private bool CanGetQueueProperties() 
{ 
    if (_QueueList.Count > 0) 
    { 
     return true; 
    } 
    return false; 
} 

private void GetQueueProperties() 
{ 
    if (CanGetQueueProperties()) 
    { 
     ResponseMessage.Add("Queue name: " +SelectedFromQueue.Name); 
    } 
} 

Güncelleme: sll teşekkürler!

  <ListView.Resources> 
       <Style TargetType="{x:Type ListViewItem}"> 
        <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/> 
       </Style> 
      </ListView.Resources> 

Geride kod için aşağıdaki C# yöntemi eklendi:

benim XAML koduna aşağıdaki eklendi

 protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e) 
     { 
      ListViewItem item = (ListViewItem)sender; 
      item.IsSelected = true; 
     } 

büyük! Referans için tekrar teşekkürler!

+1

bu soruyu kontrol you: WPF: [Trigger SelectedIndex bir ListBoxItem alanı içinde herhangi bir kontrol tıklarken değişti] (http://stackoverflow.com/questions/6680987/wpf-trigger-selectedindex-changed-whilst-clicking-on-any-control-within -a-listb) – sll

cevap

1

GetQueueProperties'un ne yaptığını bilmiyorum, ancak mantığınızı yürütmek için hangi öğenin çalıştırılacağını ve GUI'deki seçimin ikincil olduğunu bildiğinizden emin olmak için SelectedFromQueue kullanıyorsunuz. Eğer durum buysa

, SelectedFromQueue kullanmak ancak Button bu katmayan:

CommandParameter="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}" 

Bu, SelectedFromQueue içinde e.Parameter olarak basılan düğme satırı ile ilişkili bir Queue nesneyi verecektir.

yapmanız EğerSelectedFromQueue eklenti başında, GUI için seçilen öğeyi ayarlamak gerekir: belki Rachel tarafından sağlanan çözüm yardımcı olacak, daha önce aynı sordunuz

SelectedFromQueue = (e.Parameter is Queue) ? e.Parameter : null 
+0

Teşekkürler XAMeLi Bu yayına eklediğim yeni kodu not alın. ListView için EventSetter'a erişmek için yeni bir ListView.Resource ekledim. Olay işleyicisi, arkadaki kodda yeni bir C# yöntemine bağlanır.C# yöntemi SelectCurrentItem, kullanıcı fareyi ListView'daki herhangi bir satırın üzerine getirdiğinde "IsSelected" özelliğini true olarak ayarlar. Şimdi, kullanıcılarım satır ile ilişkili bir düğmeyi tıklayabilir ve ObservableCollection'dan ilgili nesneye erişebilir. – EnLaCucha