2011-01-28 102 views
2

这个问题涉及一个小小的Winforms GUI。让我们知道,我有数据绑定和INotifyPropertyChanged的基本知识,并在WPF中的ViewModels中使用它们。但我不知道Winforms。这是一个学校作业。更新列表框的显示成员

所以我有一个有DisplayName属性的类。我也有一个ListBox其是我班的一系列实例。我已指出myListBox.DisplayMember = "DisplayName";在我的课程实例中更改了一个值后,会导致DisplayName属性返回不同的值,那么如何告知我的ListBox再次拉动DisplayName属性以刷新其值?

回答

2

这样做,这样可能需要重新绑定列表框,丢失的selectedIndex等

一个解决办法是忘记DisplayMember属性和处理ListBox的Format事件来代替。像(从内存):

// untested 
e.Value = (e.Item as MyClass).DisplayValue; 
3

我需要做同样的事情,但与组合框。我找到的解决方法是清除并重置DisplayMember属性。

这工作:

myComboBox.DisplayMember = null; 
myComboBox.DisplayMember = "DisplayName"; 

重要的是要注意,这也许不是最好的解决方案,因为它会导致多个SelectedValueChanged事件,但最终的结果是成功的很重要的。

0

我知道这是很久以前的事,但我有类似的问题,但没有找到令人满意的解决方案,并与这个单线末更新值之后,终于解决了:在列表框

bindingsource.EndEdit(); 

项目反映输入的任何更改在更新按钮点击后,进入文本框。所以像这样的线路后:

textbox1.DataBindings["Text"].WriteValue(); 
textbox2.DataBindings["Text"].WriteValue(); 

只需插入这一行:

bindingsourcevariable.EndEdit(); 

希望这有助于其他人谁也遇到类似的问题,但还没有找到合适的解决方案

0

这里是解决方案代码它在XAML中执行所有的操作,而不是后端的C#。这是我该怎么办利用MVVM我的项目(减少后端代码,如果可能的话没有后端代码)

<ListBox x:Name="lstServers" HorizontalAlignment="Left" Height="285" Margin="20,37,0,0" VerticalAlignment="Top" Width="215" 
       ItemsSource="{Binding Settings.Servers}" 
       SelectedItem="{Binding Settings.ManageSelectedServer, Mode=TwoWay}" 
       DisplayMemberPath="UserFriendlyName"/> 

这是窗口列表框。这里指出的要点非常棘手,通常的ItemsSource属性被设置为我的视图模型上的Settings对象,该对象具有Servers Observable集合。

服务器是一个具有名为UserFriendlyName属性的类。

public sealed class AutoSyncServer : ObservableModel 
    { 
     public AutoSyncServer() 
     { 
      Port = "80"; 
      UserFriendlyName = "AutoSync Server"; 
      Server = "localhost"; 
     } 

     private string _userFriendlyName; 
     public string UserFriendlyName 
     { 
      get { return _userFriendlyName;} 
      set 
      { 
       _userFriendlyName = value; 
       OnPropertyChanged("UserFriendlyName"); 
      } 
     } 

这是您自己的类的部分代码片段。

ListBox的SelectedItem绑定到我存储在名为ManageSelectedServer的模型视图中的Selected对象的实例。

棘手的部分这里是DisplayMemberPath设置为“UserFriendlyName”而不是“{Binding UserFriendlyName}”。 这是密钥

如果使用{Binding UserFriendlyName},它将在集合中显示UserFriendlyNames,但不会反映对该属性的任何更改。

的XAML对TextBox其中用户可以更新用户友好名称(其应该改变在列表框中也文本)是:

<TextBox x:Name="txtDisplayName" HorizontalAlignment="Left" Height="23" Margin="395,40,0,0" TextWrapping="Wrap" 
       Text="{Binding ElementName=lstServers,Path=SelectedItem.UserFriendlyName, UpdateSourceTrigger=PropertyChanged}" 

VerticalAlignment =“顶部” WIDTH =“240” />

这设置TextBox的Text属性并将其绑定到ListBox元素lstServers SelectedItem属性UserFriendlyName。我还包含一个UpdateSourceTrigger = PropertyChanged,以便对文本源进行的任何更改都会通知它们已被更改。

XAML很棘手!