c# - 如何为我的 UserControl 绑定(bind)不同的 DataContext?

标签 c# .net wpf mvvm

所以我有一个像这样设置的应用程序。
我的 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这是我在 ItemsControl 中的 UserControl,这正是它应该做的,它还绑定(bind)了 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,如您在顶部看到的,但我不知道如何将 UserControl 的 DataContext 绑定(bind)到其他东西,以便我可以为 ContextMenu MenuItems 创建命令

我确实设置了一个适用于 ViewModel 的 RelayCommand,因为我在那里正确设置了 DataContext。

现在 UserCard 数据上下文从 MainWindow View 中的父级继承,这使得它的属性的 DataContext 都来自 User
public class User : ObservableObject
    {
        public ImageSource Avatar { get; set; } 
        public string Description { get; set; }
        public int Id { get; set; }
    }

我希望能够为该特定控件创建一个 ViewModel 并向其添加命令,或者我可以将其绑定(bind)到 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

    });

如果我像这样在 CodeBehind 中设置 DataContext,该命令可以正常工作,但是我看不到任何文本
public partial class UserCard : UserControl
    {
        public UserCard()
        {
            InitializeComponent();
            this.DataContext = new BaseViewModel();
        }
    }

最佳答案

我相信你需要这样的东西:

<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>

关于c# - 如何为我的 UserControl 绑定(bind)不同的 DataContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54348572/

相关文章:

c# - 使用 Linq 对 JSON 对象进行排序

c# - 依赖属性如何工作?

c# - "The value passed for ConditionOperator.In is empty"与 ConditionExpression 使用 ConditionOperator.In 针对空数组操作数

.net - 如何保持验证 DRY?

c# - 如何禁用 Datagrid 中的排序组顺序,但保持组内列的排序?

c# - 如何更改特定元素的 XML 命名空间

c# - 仅使用 SSL 进行身份验证

c# - 处理从主窗口中的模态对话框引发的冒泡事件

wpf - WPF 中的路由事件 - 使用操作委托(delegate)

c# - 单击和双击事件在 Canvas 中无法按预期工作