Я новичок в MVVM.У меня есть список, который заполняет список сотрудников.Я использую MVVM light и Silverlight4
<ListBox BorderBrush="Transparent"
HorizontalContentAlignment="Stretch"
VerticalAlignment="Stretch"
Name="EmployeeListBox"
Background="Transparent"
ItemsSource="{Binding Employees}"
SelectedItem="{Binding SelectedEmployee, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<sdk:Label Grid.Row="0" Grid.Column="0"
Content="Name" />
<TextBox Grid.Column="1" Grid.Row="0"
Name="EmployeeName"
Height="23"
Text="{Binding Path=Name, Mode=TwoWay}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch" />
<Button Grid.Column="2" Grid.Row="0"
Name="RefresEmployeeName"
Width="20"
Height="25"
Command="{Binding RefreshEmployeeNameCommand}"
Content="Refresh" />
<Button Grid.Column="4" Grid.Row="0"
Name="DeleteEmployee"
Width="20"
Height="25"
Content="Delete"
Command="{Binding DeleteEmployeeCommand}" />
<sdk:Label Grid.Row="1" Grid.Column="0"
Content="Description" />
<TextBox Grid.Column="1" Grid.Row="1" Height="23"
Text="Binding Path=Description}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch" />
<Button Grid.Column="2" Grid.Row="1"
Name="RefreshDescription"
Width="20"
Height="25"
Content="Refresh"
Command="RefreshDescriptionCommand" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
. Здесь отображается список сотрудников с именем и описанием, отображаемым в текстовых полях, и кнопкой «Обновить» рядом с текстовыми полями «Имя и описание сотрудника», а также кнопка «Удалить», расположенная спереди.Текстовое поле имени сотрудника.
В моей ViewModel я создал 3 RelayCommands
как
RelayCommand RefreshEmployeeNameCommand = new RelayCommand(RefreshEmployeeName);
RelayCommand DeleteEmployeeCommand = new RelayCommand(DeleteEmployee);
RelayCommand RefreshDescriptionCommand = new RelayCommand(RefreshDescription);
Когда я нажимаю кнопку RefreshEmployeeName
, содержимое в текстовом поле должно быть сброшено вего первоначальное значение, если были внесены какие-либо изменения в имя сотрудника.Когда я нажимаю кнопку DeleteEmployee
, SelectedEmployee
должен быть удален.Когда я нажимаю кнопку RefreshDescription
, любые изменения в описании должны быть сброшены.
Когда я нажимаю RefreshEmployeeName
, функция RefreshEmployeeName
не вызывается во ViewModel.Как захватить данные в текстовое поле, связанное с этой кнопкой.А также, как захватить выбранный элемент при нажатии на кнопку.Выбранный элемент обновляется, когда я нажимаю рядом с границами.
Вот моя модель вида:
public IServiceAgent ServiceAgent { get; set; }
public EditViewModel(IServiceAgent serviceAgent)
{
if (!IsDesignTime)
{
if (serviceAgent != null)
{
ServiceAgent = serviceAgent;
}
GetEmployees();
WireCommands();
}
}
private void WireCommands()
{
RefreshEmployeeNameCommand = new RelayCommand(RefreshEmployeeName);
DeleteEmployeeCommand = new RelayCommand(DeleteEmployee);
RefreshEmployeeDescriptionCommand = new RelayCommand(RefreshEmployeeDescription);
}
public RelayCommand RefreshEmployeeNameCommand { get; private set; }
public RelayCommand DeleteEmployeeCommand { get; private set; }
public RelayCommand RefreshEmployeeDescriptionCommand { get; private set; }
private void RefreshEmployeeName()
{
// have to capture the value within the textbox employee name
}
private void DeleteEmployee()
{
// have to capture the employee object which should be deleted
}
private void RefreshEmployeeDescription()
{
// have to capture the value within the textbox employee description
}
private ObservableCollection<Employee> _Employees;
public ObservableCollection<Employee> Employees
{
get
{
return _Employees
}
set
{
if _Employees!= value)
{
_Employees= value;
OnPropertyChanged("Employees");
}
}
}
public Employee _SelectedEmployee;
public DisplayDevice SelectedEmployee
{
get
{
return _SelectedEmployee;
}
set
{
if (_SelectedEmployee!= value)
{
_SelectedEmployee= value;
OnPropertyChanged("SelectedEmployee");
}
}
}
private void GetEmployees()
{
ServiceAgent.GetEmployees((s, e) => Employees = e.Result);
}