Посмотрите другой пример, как это терпит неудачу:
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
в командную строку, тогда он будет работать как положено.
Вы должны иметь возможность привязать свойство в 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>
Взгляните на это приложение на сайте www.codeproject.com. Здесь я использую CollectionView для обнаружения текущего выбранного элемента
Обновление
Использование CollectionView для обнаружения текущего выбранного элемента
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(Customers);
view.CurrentChanged += delegate
{
SelectedCustomer= (Customer)view.CurrentItem;
};
Просто не забудьте также установить IsSynchronizedWithCurrentItem = "True"