2012-03-07 9 views
14

Jestem względnie niski na krzywej dla WPF i Caliburn.Micro.Jak wykonać caliburn.micro powiązanie modelu widoku z wybraną wartością combobox?

Moim celem jest przeniesienie powiązania wybranego elementu combobox z kodu ShellView z modelem widoku, tak samo jak jest już w przypadku kolekcji przedmiotów combobox.

XAML:

<Window x:Class="EomDatabaseUtility.Views.ShellView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Eom Tool Database Utility" Height="350" Width="525"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="258" HorizontalAlignment="Left" Margin="12,41,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" /> 
     <Button Content="Execute" Height="23" HorizontalAlignment="Left" Margin="416,12,0,0" VerticalAlignment="Top" Width="75" x:Name="Execute" /> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="120" x:Name="CatalogName" SelectedValuePath="{Binding Path=SelectedCatalogName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</Window> 

Code Behind (gdzie celem jest, aby nie trzeba dodawać żadnego kodu, jeśli uderstand poprawnie):

namespace EomDatabaseUtility.Views 
{ 
    using System.Windows; 

    public partial class ShellView : Window 
    { 
     public ShellView() 
     { 
      InitializeComponent(); 
     } 

     // --> This should go in the view model, Right? 
     private string selectedCatalogName; 
     public string SelectedCatalogName 
     { 
      get { return selectedCatalogName; } 
      set { selectedCatalogName = value; } 
     } 
    } 
} 

Widok Model (obecnie dostarczanie kolekcji przedmiotów do combobox, jak również obsługi zdarzeń przycisku):

namespace EomDatabaseUtility.ViewModels 
{ 
    using Caliburn.Micro; 
    using System.Collections.Generic; 

    public class ShellViewModel : PropertyChangedBase 
    { 
     public List<string> CatalogName 
     { 
      get 
      { 
       return new List<string> { "foo", "bar" }; 
      } 
     } 

     public void Execute() 
     { 
      System.Windows.MessageBox.Show("hello"); 
     } 
    } 
} 

Odpowiedz

34

można powiązać SelectedItem z ComboBox do właściwości modelu widoku:

<ComboBox x:Name="CatalogName" ... SelectedItem="{Binding SelectedCatalog}" /> 

public class ShellViewModel : PropertyChangedBase 
{ 
    private string selectedCatalog; 

    public List<string> CatalogName 
    { 
     get 
     { 
      return new List<string> { "foo", "bar" }; 
     } 
    } 

    public string SelectedCatalog 
    { 
     get 
     { 
      return this.selectedCatalog; 
     } 

     set 
     { 
      this.selectedCatalog = value; 
      this.NotifyOfPropertyChange(() => this.SelectedCatalog); 
     } 
    } 

w rzeczywistości, ponieważ Twój ComboBox ma nazwę CatalogName konwencje Caliburn.Micro będzie szukał właściwość o nazwie SelectedCatalogName (lub ActiveCatalogName) i automatycznie wiązać ComboBox „s SelectedItem temu, tak więc można użyć:

<ComboBox x:Name="CatalogName" ... /> 

public string SelectedCatalogName 
{ 
    ... 
} 

Kilka rzeczy do uwaga:

  • Nazywamy NotifyOfPropertyChange() w seter dla SelectedCatalog. Powiadomi to interfejs użytkownika, że ​​wartość zmieniła się, gdy ustawimy go z modelu widoku, aby interfejs był aktualizowany. Ta metoda jest częścią PropertyChangedBase.
  • Powinieneś naprawdę użyć typu kolekcji, który obsługuje powiadomienia o zmianie kolekcji w Twoich modelach widoku, takie jak ObservableCollection, który pochodzi z WPF, lub Caliburn.Micro's BindableCollection (który implementuje Caliburn.Micro's IObservableCollection). Dzięki temu interfejs użytkownika może być powiadamiany o dodaniu/usunięciu obiektów z kolekcji z modelu widoku.
  • Twój model widoku powłoki prawdopodobnie powinien zaimplementować typ Screen lub Conductor (zamiast PropertyChangedBase), jeśli ma mieć cykl życia (aktywacja/dezaktywacja itp.) Lub będzie miał aktualnie aktywny element (ekran), który może zmienić się o czas pracy.
+0

dziękuję! Mam to działa z właściwością SelectedItem, ale nie SelectedCatalogName - jednak jest to po prostu bonus ... –

+2

Ah, możesz spróbować nazwać nazwy katalogowe combobox, a następnie mieć właściwość CatalogNames i SelectedCatalogName. Spodziewałbym się, że to zadziała. – devdigital

+2

Tak, to się udało ... lubię! –

Powiązane problemy