Итак, у меня есть приложение, которое настроено так.мой MainView.xaml
<ItemsControl ItemsSource="{Binding CardViewModel.Users}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.UseDefaultEffectDataTemplate="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:UserCard/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
И ViewModel
class BaseViewModel : ObservableObject
{
public CardViewModel CardViewModel { get; set; } = new CardViewModel();
}
Это прекрасно работает, он отображает два UserCards
, который является моим UserControl в ItemsControl, что именно то, что он должен делать, ион также связывает свойства Text
с тем, что ему нужно.
<Grid Style="{StaticResource UserCardStyle}">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit"/>
<MenuItem Header="Remove"
Command="{Binding BaseViewModel.CardViewModel.command}"/>
</ContextMenu>
</Grid.ContextMenu>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid Width="75"
HorizontalAlignment="Left"
Column="0">
<Ellipse Width="50"
Height="50"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="10">
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Avatar}"/>
</Ellipse.Fill>
</Ellipse>
</Grid>
<Grid Column="1">
<TextBlock Text="{Binding Description}"
TextWrapping="Wrap"
Width="180"
VerticalAlignment="Top"
Margin="10"
FontFamily="Consolas"/>
<TextBlock Width="100"
Height="20"
VerticalAlignment="Bottom"
HorizontalAlignment="Right"
Margin="5"
Text="{Binding Name}"
FontFamily="Consolas"/>
<TextBlock Width="100"
Height="20"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Text="{Binding Id}"
FontFamily="Consolas"/>
</Grid>
</Grid>
Однако я хотел добавить DataContext, как вы можете видеть вверху, но я не знаю, как связать DataContext из UserControlчто-то еще, чтобы я мог создавать команды для ContextMenu MenuItems
Я настроил RelayCommand, которая работает на ViewModel, потому что у меня там правильно установлен DataContext.
Прямо сейчас DataContext UserCardнаследует от своего родителя в представлении MainWindow, которое делает его тем, откуда DataContext для свойств взят из User
public class User : ObservableObject
{
public ImageSource Avatar { get; set; }
public string Description { get; set; }
public int Id { get; set; }
}
Я хочу иметь возможность создать ViewModel для этого конкретного элемента управления и добавить командыили около того, чтобы я мог связать его с CardViewModel
и по-прежнему отображать данные из Users
коллекции
public CardViewModel()
{
/*
* Commands
*/
command = new RelayCommand(o => LoadImage(), o => true);
AddUser = new RelayCommand(u => DisplayUserBuilder(), u => true);
Users = new ObservableCollection<User>();
Users.Add(new User
{
Name = "User",
Description = "A description",
Id = 0
});
Users.Add(new User
{
Name = "User1",
Description = "Super nice description",
Id = 1
});
Если я установилDataContext в CodeBehind, как это, команда работает нормально, но тогда я не вижу текст
public partial class UserCard : UserControl
{
public UserCard()
{
InitializeComponent();
this.DataContext = new BaseViewModel();
}
}