从别处调用的函数表现不同
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>
我有一个函数(称为 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>