从别处调用的函数表现不同

function called from elsewhere behaves differently

我有一个函数(称为 OpenExcel())可以打开 excel 文档并读取其值。

要让函数知道要打开哪个 excel 文档,必须提供一个字符串值。但是在带有条码 reader 的 MVVM 应用程序中,该函数将在 属性 赋值之前执行。 (我曾尝试在绑定中使用 UpdateSourceTrigger=PropertyChanged,但没有成功。)

我最终使用 TextBox 的 PreviewTextInput 事件手动分配给 属性(有效)。

我的问题是,当我从代码隐藏调用该函数时,视图中的列表不会更新值。 (我已经逐步完成该功能并检查那里是否有值)。但是,当我通过 Prism 的 ICommand 调用函数时,列表显示所有值。

所有相关代码:

XAML:

<TextBox Text="{Binding Serial,Mode=TwoWay}" x:Name="serial_txt" PreviewKeyDown="serial_txt_PreviewKeyDown" PreviewTextInput="serial_txt_PreviewTextInput" />
<Button Command="{Binding GetFollower}"/>
<ListView ItemsSource="{Binding Parts}"/>

代码隐藏:

public ListViewModel view;

public LCMList()
{
    InitializeComponent();
    view = new ListViewModel();
}

private void serial_txt_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if(e.Key == Key.Enter) //scanned string is always followed by Enter input. 
    {
        view.OpenExcel(sender); //Fails if called from here              
    }
} 

private void serial_txt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    view.Serial += e.Text;
}

列表视图模型:

public ICommand GetFollower
{
    get { return new DelegateCommand<object>(OpenExcel); } //Succeeds if called from here
}

private string serial;
public string Serial
{
    get { return serial; }
    set 
    { 
        serial = value; 
        OnPropertyChanged("Serial");
    }
}

private ObservableCollection<Part> parts;
public ObservableCollection<Part> Parts
{
    get { return parts; }
    set 
    { 
        parts = value; 
        SetProperty(ref parts, value); 
        OnPropertyChanged("Parts");
    }
}

public void OpenExcel(object obj)
{
    /* Find Excel document and read the applicable fields and put into partslist. 
       Needs Serial property as reference */
    Parts = partslist;
}

部件 属性 已写入其值,但视图中的列表仍为空。

总结: 函数在通过 prism 和 DelegateCommand 调用时会正确更新属性,但在从 CodeBehind 调用时不会。

而不是这个

   public LCMList()
    {
        InitializeComponent();
        view = DataCotnex;
    }

   private void serial_txt_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter) //scanned string is always followed by Enter input. 
        {
            view.OpenExcel(sender); //Fails if called from here              
        }
    } 

你可以试试

   private void serial_txt_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if(e.Key == Key.Enter) //scanned string is always followed by Enter input. 
        {
            if (!(DataContext is ListViewModel vm)) return;
                vm.OpenExcel(sender);             
        }
    } 

也不要忘记在 XAML

中添加数据上下文
    <Window.DataContext>
         <local:ListViewModel  />
    </Window.DataContext>