У меня есть следующее представление xaml:
<UserControl x:Class="MyViews.PersonView"
xmlns:views="clr-namespace:MyViews"
[...]
>
[...]
<dxb:BarManager x:Name="MainBarManager">
<dxb:BarManager.Items>
<dxb:BarButtonItem x:Name="bbiPrint"
Content="{Binding Print, Source={StaticResource CommonResources}}"
Command="{Binding PrintPersonsCommand}"
CommandParameter="{Binding PersonsCardView, ElementName=CardUserControl}"
/>
</dxb:BarManager.Items>
<Grid>
<Grid.RowDefinitions>
[...]
</Grid.RowDefinitions>
<views:CardView x:Name="CardUserControl" Grid.Row="2"/>
</Grid>
[...]
</UserControl>
CardView
определяется следующим образом:
<UserControl x:Class="MyViews.CardView"
[...]>
[...]
<dxg:GridControl ItemsSource="{Binding Persons}" SelectedItems="{Binding SelectedPersons}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" SelectionMode="MultipleRow">
[...]
<dxg:GridControl.View>
<dxg:CardView x:Name="PersonsCardView"
[...]
CardTemplate="{StaticResource DisplayCardTemplate}"
PrintCardViewItemTemplate="{StaticResource PrintCardTemplate}"/>
</dxg:GridControl.View>
[...]
</dxg:GridControl>
</UserControl>
PrintPersonsCommand
определяется следующим образом в моей ViewModel:
public class PersonViewModel
{
public PersonViewModel(...)
{
[...]
PrintPersonsCommand = new Prism.Commands.DelegateCommand<DataViewBase>(PrintPersons, CanPrintPersons);
}
public Prism.Commands.DelegateCommand<DataViewBase> PrintPersonsCommand { get; private set; }
private void PrintPersons(DataViewBase view)
{
_printService.ShowGridViewPrintPreview(view);
}
private bool CanPrintPersons(DataViewBase view)
{
return true;
}
}
Теперь, когда я нажимаю кнопку «Печать», вышеуказанный метод PrintPersons
всегда подается с null
.Как мне передать CardUserControl.PersonsCardView
в моем MyViews.PersonView
xaml выше, как мне передать это PersonCardView
моей команде?Другими словами, как мне исправить
CommandParameter="{Binding PersonsCardView, ElementName=CardUserControl}"
, чтобы он работал?
В настоящее время единственным решением, которое я нашел для этой проблемы, является замена Command
и CommandParameter
на
ItemClick="OnPrintBtnClick"
, а затем в коде PersonView
сделать файл:
private void OnPrintBtnClick(object sender, ItemClickEventArgs e)
{
var ctxt = DataContext as PersonViewModel;
ctxt.PrintPersonsCommand.Execute(CardUserControl.PersonsCardView);
}
Это работает, но я не могу поверить, что другого пути нет.Я не доволен этим решением, потому что у меня больше нет преимуществ от использования Command
, например, от автоматической оценки метода Command CanExecute
.Я также мог бы поместить xaml-код CardView
в PersonView.xaml
, но мне бы хотелось, чтобы мои элементы управления были в отдельных файлах, потому что у меня такое ощущение, что он более структурирован, и у каждого пользовательского элемента управления есть свои обязанности, которые можно разделить на отдельныефайлы.Кроме того, это решение слишком тесно связывает мой взгляд с моделью моего вида.
Может кто-нибудь помочь мне, пожалуйста?