Как связать другой DataContext для моего UserControl? - PullRequest
0 голосов
/ 24 января 2019

Итак, у меня есть приложение, которое настроено так.мой 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();
        }
    }

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Это то, что я закончил, добавив ссылку на ViewModel, а затем установив ее.

<Grid.ContextMenu>
            <ContextMenu >
                <ContextMenu.DataContext>
                    <dad:BaseViewModel/>
                </ContextMenu.DataContext>

                <MenuItem Header="Edit"/>
                <MenuItem Header="Remove"
                          Command="{Binding CardViewModel.command}"/>
            </ContextMenu>
        </Grid.ContextMenu>

Если кто-то знает «лучший» или «чище» способ сделать то же самое, пожалуйста, дайтея знаю, так как я пытаюсь развиваться как разработчик, каламбур не предназначен.

0 голосов
/ 24 января 2019

Я считаю, что вам нужно что-то вроде этого:

<Grid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Edit"/>
            <MenuItem Header="Remove"
                      Command="{Binding DataContext.CardViewModel.command, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type MainView}}"/>
        </ContextMenu>
    </Grid.ContextMenu>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...