首页 文章

ListView SelectedItem不使用MVVM Light从View Model更新

提问于
浏览
1

我使用MVVM光将ListView绑定到ViewModel上的ItemSource . 当对ViewModel上的属性进行更改时,SelectedItem不会在View中更新 .

XAML:

<ListView Grid.Row="1" SelectionMode="Single" ItemsSource="{Binding filteredAppListItemSource}" SelectedItem="{Binding selectedApp, Mode=TwoWay}">

视图模型:

public Model.V_PWT_APP_ALL selectedApp { get { return this._selectedApp; } set { this._selectedApp = value; RaisePropertyChanged(() => selectedApp); } }

从视图中选择项目会更新ViewModel,并且会更新从SelectedItem派生数据的所有控件 . TwoWay绑定似乎不起作用 .

2 回答

  • 0

    如果您希望继续使用INotified属性更改接口,则应按照以下文档设置代码:https://msdn.microsoft.com/en-us/library/ms184414(v=vs.110).aspx .

    由于您似乎不是在更改属性,而是更改项目并通知ItemsSource,因此更好的方法是实现IObserver / IObservable接口 . 这稍微简单一些,它在模型本身的类中不断更新整洁和可管理性 . 这是一个可能的代码示例:

    public class App: IObservable<App>     //where the model class is the IObserver.
    
    {
    
    private App app;
    internal App
    List<IObserver<App>> Observers = new List<IObserver<App>>();
    
    {
    
         get:
                {
    
                     return app;
                }
    
         set:
    
                {
                     app = value;
                     try
                     {
                          foreach (var observer in Observers) observer.OnNext(value);
                          foreach (var observer in Observers) observer.OnCompleted();
                     }
                     catch(Exception ex)
                     {
                          foreach (var observer in Observers) observer.OnError(ex);
                          throw;
                     }
                }
    }
    

    对于viewModel:

    public Model.V_PWT_APP_ALL selectedApp: IOberver<App>
    {
         List<Control> ControlsToBeUpdated = new List<Control>() //Each control that needs updated should implement and interface that has an .Update(type T) method where T is whatever value needs updated.
         public void OnCompleted()
         {
              //...notify taskBar, etc. 
         }
    
         public void OnError(Exception error)
         {
             //handle exception, update log, etc.
         }
    
         public void OnNext(object value)
         {
             foreach (var control in ControlsToBeUpdated) control.Update(value);
         }
    }
    

    这一开始可能看起来很乏味,但它帮助我很好地最小化和管理了ItemsSource中的更新和错误 . 最后,我发现在使用ListView ItemsSource时控制scrollView相当繁琐,并且只需使用ListView.Items.Insert(...)方法就好了,因为在更新ItemsSource并选择了scrollview时它具有经常抛出一个OutOfRange异常 . 这在MVVM中调试起来很困难 . 但是,这是另一个话题 . 我希望这有帮助 .

  • 0

    我发现问题出在SelectedItem Binding上 . 我发现我没有正确选择项目 . 我切换到使用SelectedIndex并找到正确的索引,绑定按预期工作 .

相关问题