MVVM으로 SelectedItem 이벤트를 처리하는 가장 쉬운 방법은 무엇입니까?
-
06-07-2019 - |
문제
아래 코드에서 사용자가 고객을 선택할 때 Combobox에서 고객의 이름이 표시됩니다 텍스트 상자에서. COMBox 상자를 내 ViewModel의 관측형 수집 속성으로 채우지 만 ViewModel에서 SelectedItem 이벤트를 어떻게 처리합니까?
아래 그림과 같이 코드 베어드로이를 구현하기는 쉽지만 MVVM 패턴으로 어떻게해야합니까?
나는 현재 가지고있다 대표 명령 그리고 첨부 된 비하비기 내가 사용할 수있는 기본 MVVM 템플릿에서 "Combobox가 새 항목을 선택할 때"어떻게 발사하는지 알 수는 없습니다.
보다:
<Window.Resources>
<DataTemplate x:Key="CustomerTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<DockPanel LastChildFill="False" Margin="10">
<ComboBox
x:Name="CustomerList"
ItemTemplate="{StaticResource CustomerTemplate}"
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Width="200"
SelectionChanged="CustomerSelected"
ItemsSource="{Binding Customers}"/>
<TextBlock x:Name="CurrentlySelectedCustomer"/>
</DockPanel>
뒤에 코드 :
private void CustomerSelected(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
Customer customer = (Customer)CustomerList.SelectedItem;
CurrentlySelectedCustomer.Text = String.Format("{0} {1}", customer.FirstName, customer.LastName);
}
해결책
Combobox의 선택된 속성에 뷰 모델의 속성을 바인딩 할 수 있어야합니다. 이것을 양방향 바인딩으로 설정하면 SELECTEDITEM이 변경되면 속성의 설정 메소드가 트리거되므로 알림을받습니다.
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;
};
istynchronizedwithCurrentItem = "true"를 설정하는 것을 잊지 마십시오.
제휴하지 않습니다 StackOverflow