我正在使用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绑定似乎不起作用。
答案 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并找到正确的索引,绑定按预期工作。