2011-01-28 51 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很棘手!