Привязка WPF View-ModelView Нужна помощь, пожалуйста - PullRequest
1 голос
/ 04 мая 2011

Я играл и смотрел вокруг, как связать вид модели с видом, но я не могу понять это.У меня есть представление под названием Поиск, и я хочу связать его с SearchModelView.Представление имеет одну кнопку и одно текстовое поле и выглядит:

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,40,0,0" Name="comboBox1" VerticalAlignment="Top" Width="174" />
    <Label Content="Client:" Height="28" HorizontalAlignment="Left" Margin="0,12,0,0" Name="label1" VerticalAlignment="Top" Width="71" />
    <Label Content="Client Reference:" Height="28" HorizontalAlignment="Left" Margin="0,69,0,0" Name="label2" VerticalAlignment="Top" Width="117" />
    <TextBox  
        x:Name="clientRefTxt"
        Text="{Binding Path=ClientRef, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
        Height="23" 
        HorizontalAlignment="Left" 
        Margin="12,103,0,0" 
        VerticalAlignment="Top" 
        Width="174" />
    <Button 
        Content="Search Debtors" 
        Height="23" 
        HorizontalAlignment="Left" 
        Margin="12,140,0,0" 
        Name="button1" 
        VerticalAlignment="Top" 
        Width="89" 
        Command="{Binding Path=SearchCommand}"/>

</Grid>

И я хочу, чтобы оно связывалось с SearchViewModel:

пространство имен Master.ViewModel{

public class SearchViewModel:WorkspaceViewModel
{
    RelayCommand _searchCommand;
    readonly Search _search;


    #region Search Properties
    public string ClientRef
    {

        get { MessageBox.Show("GET CLIENTREF"); return _search.ClientRef; }
        set
        {
            MessageBox.Show("SET CLIENTREF");
            if (value == _search.ClientRef)
                return;
            _search.ClientRef = value;
            base.OnPropertyChanged("ClientRef");
        }
    }

    #endregion

    public ICommand SearchCommand
    {
        get
        {
            MessageBox.Show("SEARCHCOMMAND");

            if (_searchCommand == null)
            {
                _searchCommand = new RelayCommand(
                    param=> this.Search(),
                    param=> this.CanSearch
                    );
            }
            return _searchCommand;
        }
    }

    public void Search()
    {
        MessageBox.Show("SEARCHING");
    }

    bool CanSearch
    {
        get { return true; }
    }
}

}

Я удалил все сборки сверху, но предположил, что они все есть.Также обратите внимание, что SearchViewModel находится в отдельном dll, а не в exe с View.Любая помощь была бы большой или, по крайней мере, указатель в направлении записи, я уже читал статью MSDN о MVVM, и это не помогло ... Мне нужно лучшее изложение о связывании этих частей.Заранее спасибо.PS Еще несколько подробностей: SearchViewModel принадлежит Master.ViewModel SearchView является частью GUI. У меня есть представление и представление о том, как работают связанные объекты, я не уверен, как связать представление с моделью представления

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Является ли ваш вид сетки? В качестве представлений я использовал только типы UserControl или Window, но у вас может быть успех при использовании сетки.

Несмотря на это, это самый чистый способ создания экземпляра модели представления с помощью представления UserControl. Просто замените теги UserControl на теги Grid, если вы используете Grid.

<UserControl ...(blah blah)
    xmlns:viewmodel="clr-namespace:Master.ViewModel">
    <UserControl.DataContext>
        <viewmodel:SearchViewModel/>
    </UserControl.DataContext>

Я считаю, что не использовать код View, если в этом нет необходимости, является предпочтительным шаблоном для MVVM - пусть XAML соединит вас для вас, когда это возможно.

1 голос
/ 04 мая 2011

Вам необходимо установить DataContext представления для экземпляра модели представления. Существует множество способов сделать это, включая фреймворки, которые автоматически подключаются, но самый простой способ начать это сделать в конструкторе представления:

partial class Search : Window
{
  public Search()
  {
    InitializeComponent();                // provided by Visual Studio

    DataContext = new SearchViewModel();  // all-important!
  }
}

Очевидно, вам может потребоваться предоставить другую информацию для инициализации SearchViewModel, но, надеюсь, этого достаточно, чтобы вы пошли по правильному пути.

0 голосов
/ 04 мая 2011

Вам нужно будет загрузить приложение, как подсказывает @itowlson.

Но если у вас есть несколько ViewModel, вы должны позволить WPF сделать это за вас. Основной способ сделать это (который легко поддерживать, пока у вас не будет более десятка представлений) - это создать DataTemplate, чтобы связать View с вашим ModelView (который большинство людей называют ViewModel).

Итак, предоставленный вами xaml, вероятно, находится в UserControl (по крайней мере, так должно быть), поэтому вам нужно сделать несколько вещей

Сначала создайте ResourceDictionary
(быстрый способ - щелкнуть правой кнопкой мыши по вашему проекту и нажать Add -> Resource Dictionary

В этом файле (назовем его Resources.xaml) поместите это:

<DataTemplate DataType="{x:Type vm:SearchViewModel}">
  <vw:SearchView>
</DataTemplate>

Выше предполагается, что вы поместили пространства имен vw и vm для пространств имен View и ViewModel соответственно

Перейдите к вашему App.xaml и введите это:

<Application.Resources>
    <ResourceDictionary Source="Resources.xaml"/>
</Application.Resources>

Выше будет сказано WPF, что всякий раз, когда он встречает объект типа SearchViewModel to:

  • Создание объекта SearchView
  • Установите для DataContext объект SearchViewModel

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...