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

时间:2016-12-31 09:34:20

标签: c# wpf listview mvvm-light selecteditem

我正在使用MVVM灯将ListView绑定到ViewModel上的ItemSource。当对ViewModel上的属性进行更改时,SelectedItem不会在视图中更新。

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 :(得分: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中调试起来很困难。但是,这是另一个话题。我希望这会有所帮助。

答案 1 :(得分:0)

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