Button
в представлении должно быть привязано к свойству ICommand
модели представления. Команда будет выполнена, когда вы нажмете на Button
. Пожалуйста, обратитесь к этой записи блога для получения информации о том, как обрабатывать события в приложении MVVM. В MvvmLight реализация ICommand
называется RelayCommand
.
Вам также следует связать свойства Text
TextBoxes
с двумя исходными свойствами модели представления, и элемент Canvas
в вашем представлении должен быть заменен на ItemsControl
, который вы привязываете к коллекции объектов. которые определены в модели представления.
Пожалуйста, обратитесь к следующему примеру кода.
Модель:
public class Model
{
public int Width { get; set; }
public int Height { get; set; }
public Thickness Margin { get; set; }
public Brush Fill { get; set; }
}
Вид:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="#FFF1F0F0" Margin="10" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Width="{Binding Width}"
Height="{Binding Height}"
Margin="{Binding Margin}"
Fill="{Binding Fill}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Content="Draw" Command="{Binding DrawCommand}" />
<Button Content="Reset" Command="{Binding ResetCommand}" />
<TextBox Text="{Binding Width}"/>
<TextBox Text="{Binding Height}"/>
Просмотр модели :
public class ViewModel
{
public ViewModel()
{
DrawCommand = new RelayCommand(Draw);
ResetCommand = new RelayCommand(Clear);
}
public ObservableCollection<Model> Items { get; } = new ObservableCollection<Model>();
public RelayCommand DrawCommand { get; }
public RelayCommand ResetCommand { get; }
public int Width { get; set; }
public int Height { get; set; }
private void Draw()
{
Clear();
int xParts = 10;
int yParts = 10;
for (int i = 0; i < xParts; i++)
{
for (int j = 0; j < yParts; j++)
{
Model model = new Model();
model.Width = Width;
model.Height = Height;
model.Margin = new Thickness((model.Width + 1) * i, (model.Height + 1) * j, 0, 0);
model.Fill = new SolidColorBrush(Color.FromArgb(170, 51, 51, 255));
Items.Add(model);
}
}
}
private void Clear()
{
Items.Clear();
}
}
В этом примере вся логика приложения была перемещена в модель представления, которой она принадлежит. В классе code-behind представления не осталось логики.
Также обратите внимание, что модели представлений создают экземпляры Model
объектов, а не Rectangle
элементов. Обычно считается плохой практикой ссылаться на элементы пользовательского интерфейса в классе модели представления. Элементы Rectangle
создаются ItemsControl
. См. ItemTemplate
в представлении.