ما هي أسهل طريقة للتعامل مع SelectedItem الحدث مع MVVM?

StackOverflow https://stackoverflow.com/questions/1011750

  •  06-07-2019
  •  | 
  •  

سؤال

في البرمجية أدناه ، عندما يختار المستخدم العملاء في مربع تحرير وسرد ، اسم العميل يتم عرض في مربع نص.أنا ملء Combox مربع مع ObservableCollection الملكية على ViewModel ولكن كيف يمكنني التعامل مع SelectedItem الحدث في ViewModel?

فإنه من السهل لتنفيذ هذا مع التعليمات البرمجية-خلف كما هو مبين أدناه ، ولكن كيف أفعل هذا مع نمط MVVM?

لدي حاليا DelegateCommand و AttachedBehaviors في بلدي الأساسية MVVM قالب التي يمكن استخدامها, ولكن أنا لا يمكن معرفة كيفية الحصول عليها النار عندما "مربع تحرير وسرد يختار عنصر جديد".

عرض:

<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);
}
هل كانت مفيدة؟

المحلول

يجب أن تكون قادرة على ربط خاصية في ViewModel إلى SelectedItem خاصية تحرير وسرد.إذا قمت بتعيين هذا الأمر اتجاهين ملزمة سيتم إعلامك عندما 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; 
};

فقط تذكر أيضا تعيين IsSynchronizedWithCurrentItem="True"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top