哎。我正在尝试维护MVVM模型,但在尝试绑定到列表框时却在某处绊倒。第一次运行应用程序时,我将ItemCatalog
(ObservableCollection)设置为某个ObservableCollection列表。列表框是空的,但是如果我再试一次它就可以了。但是,数据源和显示的数据之间存在延迟。例如,
我加载了应用 - >将来源设为X
- >列表框为空
我现在将源设置为Y
- >列表框显示X
我将来源设为Z
- >列表框显示Y
等..
对我而言,这意味着绑定正在起作用,但我无法弄清楚为什么它会落后于它。
我的XAML看起来像这样:
<ListBox ItemsSource="{Binding ItemCatalog}">
<DataTemplate>
<StackPanel Margin="0,0,0,17" Width="432">
<TextBlock Text="{Binding Ref}" TextWrapping="Wrap" Foreground="Black" />
<TextBlock Text="{Binding ItemName}" TextWrapping="Wrap" Margin="12,-6,12,0" Foreground="Black" />
</StackPanel>
</DataTemplate>
</ListBox>
在ViewModel中,ItemCatalog
的值取决于用户按下的任何按钮(X
,Y
,Z
),这些按钮都存储在静态变量。有没有理由延迟,或者强迫它重新绑定到最新的ItemCatalog
值?
如果我从XAML中删除绑定并直接从代码隐藏设置列表框源,它就可以正常工作。但是,我想尝试维护XAML编码。我是MVVM的新手,所以我可能会以错误的方式做这件事。感谢
编辑 - 额外代码
在OnNavigatedTo方法中更改了代码
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (NavigationContext.QueryString["Category"].ToString() == "House")
{
_categoryType = Models.House;
}
if (NavigationContext.QueryString["Category"].ToString() == "Car")
{
_categoryType = Models.Car;
}
MyViewModel.LoadNewData(_categoryType);
base.OnNavigatedTo(e);
}
LoadNewData
方法只根据传递的参数设置静态变量。
ItemCatalog = App.CarCatalog;
基本上,我需要在页面加载后通过XAML重新绑定。
答案 0 :(得分:3)
在猜测(因为仍然没有足够的代码可用),即使在实际分配了字段支持ItemCatalog
之前,ViewModel也会引发属性更改。类似的东西: -
ObservableCollection<Stuff> _ItemCatalog;
ObservableCollection<Stuff> ItemCatalog
{
get { retutn _ItemCatalog; }
set
{
PropertyChanged("ItemCatalog");
_ItemCatalog = value;
}
}
这可能会导致您描述的行为。
答案 1 :(得分:0)
您没有显示关于将源从X更改为y的任何代码,但我会从解释的行为中假设在更改发生之前正在解释视图上的数据绑定。