Привязка функции управления Silverlight к моей модели вида - PullRequest
1 голос
/ 09 декабря 2011

Хорошо, я использую эти пользовательские элементы управления.Не беспокойтесь об этой части, вопрос не относится к их работе.

Элемент управления, о котором идет речь, является сеткой (как обычная сетка), и он поставляется с функцией BeginInsert,ярлык для добавления нового элемента в список.

Теперь мне нужно иметь доступ к этому методу в моей модели представления.На данный момент у меня есть это, но оно проходит через мой код XAML, который я не хочу - я бы хотел, чтобы он шел прямо из XAML в модель представления.

Вот как этоидет в данный момент:

((UserViewModel)Resources["usersViewModel"]).HydUsersGridBeginInsert = () => this.GridViewData.BeginInsert();

Этот код находится в коде XAML позади.HydUsersGridBeginInsert имеет тип Action и находится в модели представления.GridViewData - это имя сетки.

Итак, как я могу извлечь это из моего кода и непосредственно в мою модель представления?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Я полагаю, что вы хотите, чтобы иметь возможность вызывать BeginEdit в сетке из вашей ViewModel?Есть несколько способов сделать это:

1) Вы можете использовать Messaging, как тот, что в рамках MVVM-Light.В своем коде вы подписались бы на событие BeginEdit, а в своей ViewModel вы бы опубликовали событие BeginEdit.

2) Вы можете создать поведение, здесь - аналогичный пример, гдеузел в TreeView раскрывается с помощью поведения.

Таким образом, в примере вы можете установить переменную IsBeginEdit, и поведение будет запускаться, вызывая BeginEdit для GridView. source MiscView / MiscViewModel

Поведение:

В приведенном мной примере исходного кода я использую Caliburn Micro и называю элемент кнопки x: Name = "BeginEdit"CM автоматически связывает это с моим методом BeginEdit.Если вы используете Mvvm-Light, вы можете использовать EventToCommand.

<Button Content="BeginEdit">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="Click">
            <cmd:EventToCommand Command="{Binding BeginEdit, Mode=OneWay}"
                                        PassEventArgsToCommand="True" />
        </i:EventTrigger>
     </i:Interaction.Triggers>
 </Button>

[Description("BeginEdit")]
    public class BeginEditBehavior : TargetedTriggerAction<RadGridView>
    {
        private RadGridView _radGridView;

        protected override void OnAttached()
        {
            base.OnAttached();

            _radGridView = (RadGridView) (AssociatedObject);
        }

        protected override void Invoke(object parameter)
        {
            _radGridView.BeginEdit();
        }
    }

View: 

<telerik:RadGridView ItemsSource="{Binding MyItems, Mode=TwoWay}">
                <i:Interaction.Triggers>
                    <ei:PropertyChangedTrigger Binding="{Binding IsBeginEdit, Mode=TwoWay}">
                        <i:Interaction.Behaviors>
                            <ei:ConditionBehavior>
                                <ei:ConditionalExpression>
                                    <ei:ComparisonCondition LeftOperand="{Binding IsBeginEdit}"
                                                            RightOperand="True" />
                                </ei:ConditionalExpression>
                            </ei:ConditionBehavior>
                        </i:Interaction.Behaviors>
                        <framework:BeginEditBehavior />
                    </ei:PropertyChangedTrigger>
                </i:Interaction.Triggers>
            </telerik:RadGridView>

ViewModel:

private bool _isBeginEdit;
        public bool IsBeginEdit
        {
            get { return _isBeginEdit; }
            set
            {
                _isBeginEdit = value;
                NotifyOfPropertyChange(() => IsBeginEdit);
            }
        }

        public void BeginEdit()
        {
            IsBeginEdit = true;
        }

3) И, возможно, не лучшим способом, вы могли бы сохранить ссылку на ваш Viewв вашей ViewModel.Caliburn Micro, например, дает вам способ получить доступ к вашему View GetView () из вашей ViewModel, затем вы можете получить ссылку на вашу сетку и вызвать BeginEdit ().

Мне нравится вариант 2, но 1работает так же хорошо.

1 голос
/ 09 декабря 2011

используйте событие для команды с параметрами.

 <Button Content="Add">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="Click">
            <cmd:EventToCommand Command="{Binding AddClickCommand, Mode=OneWay}"
                                        PassEventArgsToCommand="True" />
        </i:EventTrigger>
     </i:Interaction.Triggers>
 </Button>

здесь пространство имен "i" относится к xmlns: i = "clr-namespace: System.Windows.Interactivity; Assembly = System.Windows.Interactivity" и

xmlns: cmd = "clr-namespace: GalaSoft.MvvmLight.Command; assembly = GalaSoft.MvvmLight.Extras.SL4"

это набор легких инструментов Galasoft MVVM (загрузить Google)

Добавьте подобный код в viewModel, например

 public ICommand AddClickCommand { get; set; }

 AddClickCommand = new RelayCommand<string>((e) =>
 {
      this.BeginInsert();
 });

надеюсь, это сработает для вас.

Я думал, вы начнете с моего ответа.

чтоЯ хотел убедить вас в том, что

    <your:YourGrid x:Name="yourGrid">
     <i:Interaction.Triggers>
         <i:EventTrigger EventName="Loaded">
             <cmd:EventToCommand Command="{Binding GridLoadedCommand, Mode=OneWay}"
                                        PassEventArgsToCommand="True" />
        </i:EventTrigger>
     </i:Interaction.Triggers>
 </your:YourGrid>

Все, что вам нужно сделать, - это LoadedCommand.

 YourGrid grid ;
 public ICommand GridLoadedCommand { get; set; }

 GridLoadedCommand = new RelayCommand<RoutedEventHandler>((s, e) =>
 {
     grid = (YourGrid) s;
 });

 public ICommand AddClickCommand { get; set; }

 AddClickCommand = new RelayCommand<string>((e) =>
 {
      grid.BeginInsert();
 });


 Now what you say about this.
...