как я могу получить данные из представления - PullRequest
1 голос
/ 13 августа 2010

Я использую MVVM для создания своего проекта, теперь у меня есть некоторые проблемы, когда я нажимаю кнопку, я хочу получить данные из представления в viewmodel, что мне делать?

спасибо Боб

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Свяжите эти данные с моделью представления и выполните команду, когда пользователь нажимает кнопку. Команда и данные находятся в модели представления, поэтому в ней есть все, что нужно.

public class YourViewModel : ViewModel
{
    private readonly ICommand doSomethingCommand;
    private string data;

    public YourViewModel()
    {
        this.doSomethingCommand = new DelegateCommand(this.DoSomethingWithData);
    }

    public ICommand DoSomethingCommand
    {
        get { return this.doSomethingCommand; }
    }

    public string Data
    {
        get { return this.data; }
        set
        {
            if (this.data != value)
            {
                this.data = value;
                this.OnPropertyChanged(() => this.Data);
            }
        }
    }

    private void DoSomethingWithData(object state)
    {
        // do something with data here
    }
}

XAML:

<TextBox Text="{Binding Data}"/>
<Button Command="{Binding DoSomethingWithData}"/>

Информацию о различных зависимостях в вышеприведенном примере, таких как ViewModel и DelegateCommand, см. В моей серии сообщений на MVVM .

РЕДАКТИРОВАТЬ после получения дополнительной информации: Для отслеживания выбора элемента просто введите модель представления для представления элемента:

public class CustomerViewModel : ViewModel
{
    private bool isSelected;

    public bool IsSelected
    {
        get { return this.isSelected; }
        set
        {
             if (this.isSelected != value)
             {
                 this.isSelected = value;
                 this.OnPropertyChanged(() => this.IsSelected);
             }
        }
    }
}

Ваша модель "основного" вида представит коллекцию этих элементов (обычно ObservableCollection<T>):

public ICollection<CustomerViewModel> Customers
{
    get { return this.customers; }
}

Ваш вид будет привязан как:

<ListBox ItemsSource="{Binding Customers}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Обратите внимание, как для каждого ListBoxItem его свойство IsSelected будет связано со свойством CustomerViewModel.IsSelected. Таким образом, ваша модель основного вида может просто проверить это свойство, чтобы определить, какие клиенты выбраны:

var selectedCustomers = this.Customers.Where(x => x.IsSelected);
0 голосов
/ 13 августа 2010

Решение, предложенное Кентом, на мой взгляд, безусловно, лучшее / единственное, которое следует за MVVM.Однако, если вы не хотите копировать / отражать выбранные списки в модели представления или хотите быстрое и - в соответствии с MVVM - грязное решение, вы можете использовать параметр команды для отправки данных из представления в модель представления.*

Для этого необходимо связать свойство CommandParameter кнопки со свойством, которое содержит данные, которые вы хотите отправить в модель представления.Для простоты я просто использовал TextBox.

<StackPanel Orientation="Vertical">
    <TextBox x:Name="Data"/>
    <Button Content="DoSomething" 
            Command="{Binding Path=DoSomethingCommand}" 
            CommandParameter="{Binding ElementName=Data, Path=Text}"/>
</StackPanel>

. Пример модели в следующем примере выглядит следующим образом.в Execute методе ICommand.

public class MyCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        string dataFromView = (string)parameter;

        // ...
        MessageBox.Show(dataFromView);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...