WPF MVVM:在子项源中绑定位于视图模型上的命令



我使用 WPF 和 MVVM design-patern,我需要绑定一个属于 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";
    }
}

我想在我的复选框对象上进行绑定:当分层数据模板的项源设置为"任务"时,我该如何执行此操作,我只能在我的"任务"fild上绑定。如何获取项源的父项?

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

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

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,不要发明轮子...;-(

最新更新