2015-06-16 7 views
0

Я изучаю WPF в колледже в этом семестре, но есть еще некоторые вещи, которые я не совсем понимаю. У меня есть следующий код:Как я могу заставить этот CommandParameter работать?

<UserControl x:Class="Reversi.SquareControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="48" d:DesignWidth="48"> 
<Button Command="{Binding Place}" CommandParameter="{Binding ????????}"> 
    ... 
</Button> 

и:

public partial class SquareControl : UserControl 
{ 

    public SquareControl(int x, int y) 
    { 
     InitializeComponent(); 
     Coordinates = new Vector2D(x, y); 
    } 

    public Vector2D Coordinates 
    { 
     get { return (Vector2D) GetValue(CoordinateProperty); } 
     set { SetValue(CoordinateProperty, value); } 
    } 

    ... 

    public static readonly DependencyProperty CoordinateProperty = 
     DependencyProperty.Register("Coordinates", typeof(Vector2D), typeof(SquareControl), new PropertyMetadata(new Vector2D(0, 0))); 
} 

Мой вопрос: что же я помещал в CommandParameter связывание пройти Coordinates к ICommand в моей ViewModel?

+0

updated-

+0

Если я поставил команду в элементе управления, то, как я должен получить доступ к методу из моей viewmodel insode команда? Должен ли я просто пройти по viewmodel к конструктору команды? – Exevan

+0

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

ответ

2
<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mine="clr-namespace:WpfApplication2" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <mine:SquareControl Coordinates="{Binding VMCoordinates, Mode=TwoWay}"/> 
    </Grid> 
</Window> 

В этом случае пространство имен «мое» является пространством имен вашего приложения. Таким образом, в главном окне строка внутри сетки говорит: «Поместите экземпляр SquareControl в мое представление и привяжите его DP, называемый« Координаты », к свойству на VM под названием VMCoordinates»

«Режим = TwoWay» означает, что либо вид, либо вид (пользователь) или виртуальная машина изменяет данные, передает их другим.

+0

Спасибо, ваше решение заставило меня понять, что я делаю неправильно. Вместо привязки координат к соответствующему свойству в моей модели просмотра я как-то пытался привязать его к себе (показывает, насколько я к этому отношусь). Я также понимаю, что мне вообще не нужно хранить координаты внутри элемента управления, я могу просто сохранить их в режиме просмотра элемента управления, так как они должны быть полностью прочитаны. – Exevan

+0

Добро пожаловать, но я думаю, вы должны пересмотреть свой дизайн. Обычно UserControl не имеет модели представления. Подумайте о том, какой третьей стороне вы покупаете. Он не поставляется с виртуальной машиной. Вы взаимодействуете с ним через DP. Когда вы будете готовы использовать его, вы помещаете его в другое представление, как в моем примере, и привязываете его к DP родителям. Я обычно имею окно или родительское представление с виртуальными машинами, но они разговаривают с пользовательскими элементами управления через привязку DP. Ваш пользовательский контроль должен быть автономным и не нуждаться в виртуальной машине. – CoderForHire

+0

Хорошо, я постараюсь переделать свой код, чтобы все DP проходили через центральную модель. – Exevan

Смежные вопросы