2010-04-29 70 views
1

很抱歉,较早的冗长帖子。这里是我简洁的(!)描述。组合框与集合视图itemssource不更新对模型的更改的选择框项目

我将集合视图绑定为组合框作为itemsSource,并将其selectedvalue与我的视图模型中的属性绑定。我必须保持IsSynchronizedWithCurrentItem =“False”。

我更改视图的源列表,然后刷新视图。已更改(添加,删除,已编辑)的项目正确显示在组合的项目列表中。但问题在于选定的项目。当我改变其属性也是组合的显示成员路径时,改变的属性值不会反射回组合的选择框。如果您打开组合下拉列表,它将正确显示在项目列表中,但不会显示在选择框中。

现在,如果我将我的XAML中的组合框标签更改为Listbox(保留所有属性),那么当所选项目的displaymember属性值更新时,这些更改会反射回列表框的选定项目。

为什么会出现这个问题?

仅供参考:

  1. 我的视图模型具有性能EmployeeCollectionView和SelectedEmployeeId这必将为组合的的ItemsSource和的SelectedValue RESP。该VM实现INotifyPropertyChanged接口。

  2. 我的核心员工类(EmployeeCollectionView的源代码清单)只是一个没有INotifyPropertyChanged的Model类。

  3. DisplayMemberPath是员工Model类的“Name”属性。我通过某种方式改变了这一点,并期望组合选择框更新值。

  4. 我尝试通过将SelectedEmployeeId设置为0(其中它正确地从itemsSource中选择虚拟“ - 全选 - ”员工条目)和旧选定值后刷新其SelectedEmployeeId。但没用。旧的价值将我带回旧的标签​​。项目集合虽然有最新的条目。

  5. 当我在视图的刷新和刷新之前使组合框的IsEditable = True时,我使IsEditable = False,然后事情正常工作!

但是这是一个补丁,是不必要的。

THX

摄影指导Vinit Sankhe

回答

0

你点#2,#3,为什么这是行不通的。当ComboBox选择一个项目时,它将在框中显示Employee.Name属性。您在#2中声明Employee没有实现INotifyPropertyChanged,在#3中您正在更改Name并期望它在ComboBox中更新。但ComboBox不知道属性发生了变化,所以它的显示值不会改变。

我已经把一个非常简单的例子展示出来。如果您注释掉PropertyChanged事件,您会注意到单击该按钮不再对UI有影响。

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     SizeToContent="WidthAndHeight"> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding}" DisplayMemberPath="Name" SelectedIndex="0" Width="150" Height="25" /> 
     <Button Content="Change" Width="75" Height="25" Click="button_Click"/> 
    </StackPanel> 
</Window> 

而后面的代码...

public partial class MainWindow : Window 
{ 

    private ObservableCollection<Thing> things; 
    private Queue<string> words; 

    public MainWindow() 
    { 

     // some dummy data 
     string text = "Lorem ipsum dolor sit amet consetetur sadipscing elitr sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat sed diam voluptua"; 
     words = new Queue<string>(text.Split(' ')); 

     things = new ObservableCollection<Thing>(); 
     things.Add(new Thing { Name = words.Dequeue() }); 
     things.Add(new Thing { Name = words.Dequeue() }); 
     things.Add(new Thing { Name = words.Dequeue() }); 

     DataContext = things; 

     InitializeComponent(); 

    } 

    private void button_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     things[0].Name = words.Dequeue(); 
    } 

} 
+0

乔希嗨, THX对疗法的答案,但那么为什么这项工作的列表框。列表框的选定项目正确显示更新的名称(不带INotify接口)。 据我所知,在MVVM中,核心模型类(我的例子中的员工类)不建议有INotifyPropertyChanged。只有ViewModel实现这个接口。 – 2010-04-30 10:44:35

+0

没有看到代码,我很难分辨ListBox的工作原理。但是你对MVVM的理解并不一定是错误的,但是MVVM还是比较新的,并没有真正的硬性规定。事实是,在MVVM中,您不应该直接在用户界面中公开“模型”类,但每个人都会不时地违反该规则。但是,如果您想要更改绑定成员以反映在用户界面中,则必须*实施INotifyPropertyChanged。 – Josh 2010-04-30 13:10:10

相关问题