Что самый легкий путь состоит в том, чтобы обработать событие SelectedItem с MVVM?

Посмотрите другой пример, как это терпит неудачу:

module Main where
import Unique

helper :: Int -> Unique
-- noinline pragma here doesn't matter
helper x = newUnique ()

main = do
  print $ helper 3
  print $ helper 4

С этим кодом эффект такой же, как в примере ntc2: корректно с -O0, но неверно с -O. Но в этом коде нет «общего подвыражения для устранения».

На самом деле здесь происходит то, что выражение newUnique () «выплывает» на верхний уровень, поскольку оно не зависит от параметров функции. В GHC говорят, что это -ffull-laziness (по умолчанию включено с помощью -O, может быть отключено с помощью -O -fno-full-laziness).

Таким образом, код фактически становится таким:

helperworker = newUnique ()
helper x = helperworker

И здесь помощник - это метод, который может быть оценен только один раз.

С уже рекомендованными прагмами NOINLINE, если вы добавите -fno-full-laziness в командную строку, тогда он будет работать как положено.

10
задан Edward Tanguay 18 June 2009 в 09:34
поделиться

2 ответа

Вы должны иметь возможность привязать свойство в ViewModel к свойству SelectedItem выпадающего списка. Если вы настроите это как двустороннюю привязку, вы будете уведомлены при изменении SelectedItem, потому что это вызовет метод set для свойства.

ViewModel:

public ObservableCollection Customers
{
   get { return _customers; }
   set
   {
       if (_customers != value)
       {
           _customers = value;
           OnPropertyChanged("Customers");
       }
   }
}

public Customer SelectedCustomer
{
   get { return _selectedCustomer; }
   set
   {
       if (_selectedCustomer != value)
       {
           _selectedCustomer= value;
           LastName= value.LastName;
           OnPropertyChanged("SelectedCustomer");
       }
   }
}

public Customer LastName
{
   get { return _lastName; }
   set
   {
       if (_lastName!= value)
       {
           _lastName= value;
           OnPropertyChanged("LastName");
       }
   }
}

Xaml:

<DockPanel LastChildFill="False" Margin="10">
    <ComboBox 
        x:Name="CustomerList"
        ItemTemplate="{StaticResource CustomerTemplate}"
        HorizontalAlignment="Left"
        DockPanel.Dock="Top" 
        Width="200"
        SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"
        ItemsSource="{Binding Customers}"/>

    <TextBlock x:Name="CurrentlySelectedCustomer"
               Text="{Binding LastName}"/>
</DockPanel>
12
ответ дан 3 December 2019 в 18:00
поделиться

Взгляните на это приложение на сайте www.codeproject.com. Здесь я использую CollectionView для обнаружения текущего выбранного элемента

Обновление

Использование CollectionView для обнаружения текущего выбранного элемента

ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers); 
view.CurrentChanged += delegate 
{ 
    SelectedCustomer= (Customer)view.CurrentItem; 
};

Просто не забудьте также установить IsSynchronizedWithCurrentItem = "True"

10
ответ дан 3 December 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: