2016-06-01 2 views
0

У меня есть UserControlBase с сеткой. Сетка содержит столбец с Action.ICommand не работает в Silverlight Пользовательский контроль

<sdk:DataGridTemplateColumn Header="Action"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Button Style="{StaticResource DataGridButton}" Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" Content="Modify" /> 
      </StackPanel> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

Моя проблема с моим Command. Это бросает меня Техническая ошибка, которая является моей первой проблемой, я не знаю, как сделать это приложение бросить мне настоящее сообщение об ошибке.

В коде позади моего пользовательского элемента управления Я зарегистрировал события:

protected void RegisterMessages() 
{ 
    Messenger.Default.Register<string>(this, "NewNewsBtn_Click", NewNewsBtn_Click); 
    Messenger.Default.Register<string>(this, "ModifyNewsBtn_Click", ModifyNewsBtn_Click); 
} 

И в моем конструкторе:

public NewsWindow(int underlyingId) 
{ 
    InitializeComponent(); 
    this.RegisterMessages(); 
    viewModel = new NewsViewModel(underlyingId); 
    ucNewsPanel.DataContext = viewModel; 
} 

Мой вид модели (NewsViewModel)

public ICommand ModifyNewsCommand 
{ 
    get 
    { 
     return new RelayCommand<string>(e => 
     { 
      Messenger.Default.Send(string.Empty, "ModifyNewsBtn_Click"); 
     }); 
    } 
} 

Что такое странно, что мой NewNewsBtn работает, а мой ModifyNewsBtn не является.

Эта кнопка находится за пределами сетки, поэтому она может повлиять на то, почему она работает.

<Button x:Name="NewNewsBtn" MaxHeight="50" MaxWidth="100" Command="{Binding Path=NewNewsCommand}" Content="Add New" /> 
+0

Почему вы используете StaticResource в вашем Binding вместо того, чтобы просто получить доступ к DataContext? Мне кажется, что это причина того, что ваша кнопка не работает. – Martin

+0

Я предполагаю, что эта часть неверна ** Command = "{Binding Source = {StaticResource NewsViewModel}, Path = ModifyNewsCommand}" ** – ViVi

+0

@Martin - Если удалить StaticResource и просто оставить Path, он не работает. Это не бросает мне ошибку, но не входит в метод. –

ответ

1

Ваш DataGrid будет привязан к некоторой коллекции, имеющей строку на каждый элемент. Теперь элемент является DataContext для строки. Что вам нужно сделать, это привязать ваш «Modify» -button к родительскому DataContext. Если вы используете silverlight5 вы можете использовать AncestorBinding:

<Button 
    Content="Modify" 
    Command="{Binding 
     Path=DataContext.ModifyNewsCommand, 
     RelativeSource={RelativeSource AncestorType=UserControl}}"/> 
+0

Это сработало! Большое спасибо! –

0

Ваш синтаксис выглядит хорошо:

<Button Style="{StaticResource DataGridButton}" Content="Modify" 
    Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}"/> 

Но вы установили ViewModel в коде. Я прав, что вы создали StaticResource в XAML? Если это так, то просто удалите настройку DataContext из причины кода, следующая строка Command="{Binding Source={StaticResource NewsViewModel}, Path=ModifyNewsCommand}" увидит в другом экземпляре вашей модели viewModel. (Потому что у Вас есть создать два экземпляра NewsViewModel как StaticResource и код-сзади)

Update:
Я нуждался в DataContext в коде позади, как я передаю параметр в моей модели представления. Как я могу это сделать, если я удалю его из кода?
Тогда вы должны удалить StaticResource из Связывание Command:

<Button Style="{StaticResource DataGridButton}" Command="{Binding ModifyNewsCommand}" 
                    Content="Modify"/> 

Потому что вы ссылаетесь на другой экземпляр NewsViewModel.

+0

Мне нужен «DataContext» в коде, поскольку я передаю параметр моей модели. Как я могу это сделать, если я удалю его из кода? –

+0

@GeraldGonzales, пожалуйста, см. Мой обновленный ответ – StepUp

+0

обновленный ответ не будет работать. Он не может найти модель представления. –

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