Как сделать калибровку.micro привязки модели представления к выбранному значению в выпадающем списке? - PullRequest
14 голосов
/ 08 марта 2012

У меня относительно низкая кривая как для WPF, так и для Caliburn.Micro.

Моя цель здесь - переместить привязку выбранного элемента комбинированного списка из кода ShellView к модели представления, то же самоекак это уже делается для коллекции элементов в выпадающем списке.

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>

Код позади (где цель не должнадобавьте любой код, если я правильно понимаю):

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; }
        }
    }
}

Просмотреть модель (в настоящее время предоставляет набор элементов в комбинированный список, а также обработчик события кнопки):

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");
        }
    }
}

1 Ответ

36 голосов
/ 08 марта 2012

Вы можете привязать SelectedItem из ComboBox к свойству в вашей модели представления:

<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);
       }
    }

Фактически, поскольку ваше ComboBox имеет имя CatalogName , соглашения Caliburn.Micro будут искать свойство с именем SelectedCatalogName (или ActiveCatalogName) и автоматически связывать ComboBox SelectedItem к этому, поэтому вы можете использовать:

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

public string SelectedCatalogName
{
  ...
}

Несколько замечаний:

  • Мы вызываем NotifyOfPropertyChange() в установщике для SelectedCatalog. Это уведомляет пользовательский интерфейс о том, что значение изменяется всякий раз, когда мы устанавливаем его из модели представления, так что пользовательский интерфейс обновляется. Этот метод является частью PropertyChangedBase.
  • Вам действительно следует использовать тип коллекции, который поддерживает уведомления об изменениях коллекции в моделях представления, например ObservableCollection, который поставляется с WPF, или Caliburn.Micro's BindableCollection (который реализует Caliburn.Micro's IObservableCollection). Это позволяет пользовательскому интерфейсу получать уведомления при добавлении / удалении объектов из ваших коллекций из модели представления.
  • Ваша модель вида оболочки, вероятно, должна реализовывать тип Screen или Conductor (вместо PropertyChangedBase), если она будет иметь жизненный цикл (активация / деактивация и т. Д.) Или будет иметь активный в данный момент элемент ( экран), который может измениться во время выполнения.
...