2009-12-14 43 views
3

我已经在这个圈子里绕了两天,我希望WPF大师能够看到我要出错的地方。控制内容控件的MVVM ListBox

我在代码中设置CurrentViewModel。我的ListBox的选定项目和我的ContentControl的内容正确绑定。但是,当通过UI更改列表框中的选定项目时,CurrentViewModel正在设置,但内容控件未被更新。

我正在使用数据模板来映射我的视图和视图模型。

<DataTemplate DataType="{x:Type ViewModel:MyViewModel}"> 
     <View:MyView /> 
    </DataTemplate> 

我有一个ListBox绑定到可观察的ViewModel集合。选定项目绑定到当前视图模型。

<ListBox ItemsSource="{Binding MyViewModelCollection}" DisplayMemberPath="DisplayName" SelectedItem="{Binding CurrentViewModel, Mode=TwoWay}"/> 

我也有也必然要在CurrentView示范内容控制

<ContentControl Content="{Binding CurrentViewModel, Mode=TwoWay}"/> 

这是我所编辑的,他们都必然要

 public MyViewModel CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      if (_currentViewModel== value) return; 

      _currentViewModel= value; 
      OnPropertyChanged("CurrentViewModel"); 
     } 
    } 

财产名称清晰并删除格式信息。

任何帮助极大的赞赏。

干杯,

丹尼尔

编辑:在链路How can I debug WPF bindings?来了。我在Content绑定上设置了一个断点,并且在第一次设置绑定时确实只会调用一次。

回答

4

你不应该设置为双向您ContentControl中的模式:

<ContentControl Content="{Binding CurrentViewModel, Mode=OneWay}"/> 

这是因为你想你的ContentControl中以阅读价值,但从来没有它。


顺便说一句,你还可以通过执行这个绑定ContentControl中到当前所选的项目集合中,而不是该属性:

<ListBox ItemsSource="{Binding MyViewModelCollection}" 
     DisplayMemberPath="DisplayName" 
     IsSynchronizedWithCurrentItem="True"/> 

<ContentControl Content="{Binding MyViewModelCollection/}"/> 

的“斜线”(/)在集合的末尾指示集合中选择的当前项目,并设置当前项目属性与将IsSynchronizedWithCurrentItem设置为true一样简单。

很多次我发现这个组合,我真的不需要我的视图模型的额外属性。

无论如何,我希望这有助于。

+0

感谢您的建议,我将内容的绑定设置为单向。这就是它原来的样子,我认为我把它设置为两种方式来测试它是否有任何作用。 我尝试了绑定的替代方法,并保留相同的行为。初始绑定设置为确定,但更改列表框不会更新内容。 – Spruce 2009-12-15 00:47:42

+0

我做了一个样子,看起来完全像你的文章,它似乎工作。你确定你的财产上的二传手正在射击吗?我想你可能还有其他事情正在进行。 试着用一个简单的字符串集合来做同样的事情。回到基础并检查你的假设。使用字符串集合将消除数据类型问题。这可能是你的数据模板不太正确。 – 2009-12-15 12:44:10

+0

感谢您的帮助。我对样品做了同样的工作。回到我的主应用程序,问题是如何激活区域。仍然不确定为什么它会工作一次。再次感谢。 – Spruce 2009-12-16 00:05:33