ListView SelectedItem未使用MVVM Light从视图模型更新



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

XAML:

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

ViewModel:

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

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

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

如果您想继续使用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;
}
}
}

对于视图型号:

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时运气更好。项目。Insert(…)方法,因为当更新ItemsSource并选择滚动视图时,它经常引发OutOfRange异常。在MVVM中进行调试可能会很困难。然而,这是另一个话题。我希望这能有所帮助。

最新更新