【问题标题】:Listbox binding - delayed by one source列表框绑定 - 由一个来源延迟
【发布时间】:2011-04-20 00:21:33
【问题描述】:

嘿。我正在尝试维护 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 的值取决于用户按下的按钮(XYZ),它们都存储在静态变量中。是否有延迟的原因,或者有办法强制它重新绑定到最新的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 重新绑定。

【问题讨论】:

    标签: c# silverlight data-binding mvvm windows-phone-7


    【解决方案1】:

    您没有显示将源从 X 更改为 y 的位置的任何代码,但我会根据解释的行为假设您视图上的数据绑定在更改发生之前被解释。

    【讨论】:

    • ItemCatalog 是 ObservableCollection 吗?
    • 我设法解决了它(检查接受的答案),但是是的,ItemCatalog 是一个 ObservableCollection。
    【解决方案2】:

    猜测(因为仍然没有足够的代码可以继续)您的 ViewModel 甚至在实际分配支持 ItemCatalog 的字段之前就引发了属性更改。类似的东西:-

     ObservableCollection<Stuff> _ItemCatalog;
     ObservableCollection<Stuff> ItemCatalog 
     {
    
        get { retutn _ItemCatalog; }
        set
        {
           PropertyChanged("ItemCatalog");
           _ItemCatalog = value;
        }
     }
    

    这可能会导致您描述的行为。

    【讨论】:

    • 这是在黑暗中拍摄的好照片! :D 我移动了 NotifyPropertyChange 方法并在 View 中,我将 DataContext 放在 ViewModel 的 PropertChanged 事件中。我认为 DataContext 只需要设置一次,但似乎每次引发 PropertyChange 事件时我都必须设置它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多