wpf ICommand未运行任务

jv4diomz  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(126)

我在View-B中从Viewmodel-B更新Viewmodel-A中的属性。在调用属性更新的同一函数中,视图切换到View-A;我在private async Task RepopulateFieldValues上设置的断点没有被命中。
因此,当我在View-B中单击按钮时,我看到Viewmodel-B中的所有相关断点都被命中,我的视图切换到View-A,我看到ICommand上的断点被命中,仅此而已。然后,如果我将视图切换回任何其他视图,我看到Tasks上的断点被命中。我知道我有一些错误。
这是我在Viewmodel-A中的属性,通过Viewmodel-B更新:

private int _ApptSelected;
        public int ApptSelected {
            get { return _ApptSelected; }
            set {
                _ApptSelected = (MainViewModel.ApptID.Count > 0) ? MainViewModel.ApptID[0] : 0;
            }
        }

下面是我的ICommand:

public ICommand RepopulateFields_Command => new AsyncRelayCommand(RepopulateFieldValues);

这是我能想到的触发RepopulateFields_Command的唯一方法:

<TextBox x:Name="HackProperty"
                 Text="{Binding ApptSelected,
                        Mode=OneWay,
                        NotifyOnSourceUpdated=True,
                        UpdateSourceTrigger=PropertyChanged}" >
            <behaviors:Interaction.Triggers>
                <behaviors:EventTrigger EventName="TextChanged">
                    <behaviors:InvokeCommandAction Command="{Binding RepopulateFields_Command}" />
                </behaviors:EventTrigger>
            </behaviors:Interaction.Triggers>
        </TextBox>

这就是我试图运行的“级联”任务:

private async Task RepopulateFieldValues()
        {
            if (ApptSelected > 0)
            {
                Console.WriteLine("ApptSelected: " + ApptSelected);
                await RetrieveEditInfo(ApptSelected);
            }
        }

这是Viewmodel-B中的相关代码(用于切换视图)

public void EditSelection_Clicked(object obj)
        {
            if(Messaging.AskQuestion("Do you want to edit this appointment?"))
            {
                SelectedVM = AppointmentsViewModel.ApptTabItems[1];
                AppointmentsViewModel.ApptTabItems[1].IsSelected = true;
                ApptSelectedID = ApptIDSelected.ApptID;
                Messaging.ShowAlert("ID: " + ApptSelectedID);
                MainViewModel.ApptID.Clear();
                MainViewModel.ApptID.Add(ApptSelectedID);
            }
        }
zfycwa2u

zfycwa2u1#

您使用的EventTrigger只能处理路由事件,而TextChanged不是路由事件,这意味着当您在TextBox中键入内容时,您的命令不会被调用。
但是如果您只是想触发并忽略该命令,则应该能够直接在绑定到TextBoxApptSelected的setter中执行它:

public int ApptSelected {
    get { return _ApptSelected; }
    set {
         _ApptSelected = (MainViewModel.ApptID.Count > 0) ? MainViewModel.ApptID[0] : 0;
         _ = RepopulateFieldValues();
        }
    }

那么您根本不需要为TextChanged事件操心。

相关问题