【问题标题】:WPF MVVM : Bind a command which is on a ViewModel in a Child ItemSourceWPF MVVM:在子 ItemSource 中绑定 ViewModel 上的命令
【发布时间】:2018-09-20 04:48:42
【问题描述】:

我正在使用带有 MVVM 设计模式的 WPF,我需要绑定一个属于 ItemsSource 绑定父级的命令: 查看:

<Window x:Class="TaskSupervisor.MainWindow"
        ...
        ...>
    <Window.DataContext>
        <local:TacheGroupeViewModel/>
    </Window.DataContext>
    <Grid>
        <TreeView x:Name="TachesTree" ItemsSource="{Binding TachesGroupes.GroupesConfig}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Value.Tasks}">
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                              <CheckBox x:Name="InProgress" 
                                          IsChecked="{Binding ModifInProgress}">
                                </CheckBox>

                                <StackPanel Grid.Row="2" Grid.Column="2" Orientation="Horizontal">
                                    ...
                                </StackPanel>

                                <StackPanel Grid.Row="3" Grid.Column="2" Orientation="Horizontal">
                                    ...
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                    <TextBlock Text="{Binding Value.DisplayGroupe, Mode=OneWay}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

视图模型:

class TacheGroupeViewModel : INotifyPropertyChanged {

    public Model.TachesGroupes TachesGroupes { get; set; }

    public TacheGroupeViewModel() {
        this.TachesGroupes = new Model.TachesGroupes();
        // return a  Dictionary<string, CustomClass> Object
       // CustomClass => Contain some field and a List Of custom class
    }

    private ICommand _cmdEnCoursDeTraitement;
    public ICommand CmdEnCoursDeTraitement {
        get {
            return _cmdEnCoursDeTraitement ?? ( _cmdEnCoursDeTraitement = new RelayCommand(x => {Test(); }) );
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    public void Test() {
        var test = "xD";
    }
}

我想在我的 Checkbox 对象上进行绑定:当 HierarchicalDataTemplate 的 Items 源设置为“Tasks”时,我该怎么做?我只能在我的“Tasks”字段上绑定。 如何获取ItemSource的父级?

【问题讨论】:

  • 您将使用相对源绑定。我不清楚 modifinprogress 会在哪里。如果它在上一级的 treeviewitem 中,则绑定 DataContext.YouProperty、relativesource 祖先类型 treeviewitem 和祖先级别 2。如果它在窗口视图模型中,则 relativesource 将是 treeview (可能与 window 具有相同的数据上下文)。
  • 另一种选择是在TacheGroupeViewModel 上添加对父项的引用并浏览该项以进行绑定。
  • 也许我做错了,这是我的第一个真正的 MVVM 应用程序,也许我这样做的方式存在更深层次的问题
  • 命令在哪里?我看不出是否在 XAML 中。
  • 这里没有导致绑定错误。但是如果我要在复选框上绑定一个命令,我怎样才能得到我的 ViewModel Icommand ?

标签: c# wpf mvvm


【解决方案1】:

而不是找到正确的父级和视图模型...我有一个主要用于上下文菜单的 Forward 模式...

我所有的视图模型都有这个命令

private ICommand forwardCommand;
    public ICommand ForwardCommand
    {
        get
        {
            if (forwardCommand == null)
                forwardCommand = new RelayCommand<string>(
                    delegate(string param)
                    {
                        Messenger.Default.Send<CommandContext>(GetForwardCommandContext(param),
                            ViewModelBaseMessages.ContextCommand );
                    },
                    delegate(string param)
                    {
                        return CanForwardCommand(param);
                    });
            return forwardCommand;
        }
    }

然后将其转发到已注册到 forward_message 的视图模型

Messenger.Default.Register<CommandContext>(this, ViewModelBaseMessages.ContextCommand,
            (CommandContext o) =>
            {
                ExecuteDistantCommand( o );
            } );

您可以在我的项目中找到此代码 github 请使用像 mvvmlight 这样的 mvvm nuget,不要发明轮子......;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2011-11-07
    • 1970-01-01
    • 2012-06-17
    • 2015-06-05
    • 2013-04-25
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多