2011-01-28 9 views
2

この質問は、ちょっとした小さなWinforms GUIを扱っています。データバインディングとINotifyPropertyChangedに関する基本知識があり、WPFの両方のViewModelsで両方を使用することがわかっています。しかし私はWinformsを知らない。これは学校の割り当てのためのものです。ListBoxのDisplayMemberを更新する

私はDisplayNameプロパティを持つクラスを持っています。私もListBoxを持っていて、そのItemsはmyクラスのインスタンスのシーケンスです。私は指摘しましたmyListBox.DisplayMember = "DisplayName";DisplayNameプロパティが別の値を返す原因となるクラスのインスタンスの値を変更した後、DisplayNameプロパティを再度プルするために、ListBoxプロパティを再度リフレッシュするように指示するにはどうすればよいですか?この方法はおそらくそれをやって

答えて

2

再結合

回避策の一つは、DisplayMemberプロパティを忘れて、代わりにリストボックスのFormatイベントを処理するためにあるのselectedIndexなど失う、リストボックスが必要です。何かが好き(メモリから):

// 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

を発見していない他の人に役立つソリューションのコードがありますバックエンドのC#とは対照的に、XAMLのすべてを行います。これは、これは、ウィンドウ上のリストボックスである

<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"/> 

私は私のプロジェクトは、(何のバックエンドコードを持たないバックエンドのコードを最小限に抑え、かつ可能な場合)MVVMを利用しない方法です。ここで指摘するキーは非常に難解かもしれませんが、Servers Observableコレクションを持つビューモデルのSettingsオブジェクトに設定されている通常のItemsSourceプロパティです。

サーバーは、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が "{UserName}"と "UserFriendlyName"に設定されています。 これはキーです

{Binding UserFriendlyName}を使用すると、コレクションにUserFriendlyNamesが表示されますが、そのプロパティの変更は反映されません。ユーザーは(もリストボックス内のテキストを変更する必要があります)ユーザーフレンドリ名を更新することができTextBoxのため

XAMLは次のとおりです。

<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を=「トップ」幅=「240」/>

これは、TextBoxのTextプロパティを設定し、それをListBox要素lstServers SelectedItemプロパティUserFriendlyNameにバインドします。 UpdateSourceTrigger = PropertyChangedも含めて、テキストソースに加えられた変更が変更されたことを通知します。

XAMLはトリッキーです!

関連する問題