C# 更新列表框的DisplayMember

C# 更新列表框的DisplayMember,c#,winforms,C#,Winforms,这个问题涉及一个小小的Winforms GUI。让我们知道,我已经掌握了数据绑定和INotifyPropertyChanged的基本知识,并在WPF的ViewModels中使用了这两种方法。但我不知道Winforms。这是学校的作业 所以我有一个类,它有一个DisplayName属性。我还有一个列表框,它的项是我的类的一系列实例。我已经指出了myListBox.DisplayMember=“DisplayName”在我的类的一个实例中更改一个值,该值将导致DisplayName属性返回一个不同的

这个问题涉及一个小小的Winforms GUI。让我们知道,我已经掌握了数据绑定和INotifyPropertyChanged的基本知识,并在WPF的ViewModels中使用了这两种方法。但我不知道Winforms。这是学校的作业


所以我有一个类,它有一个
DisplayName
属性。我还有一个
列表框
,它的
是我的类的一系列实例。我已经指出了myListBox.DisplayMember=“DisplayName”在我的类的一个实例中更改一个值,该值将导致
DisplayName
属性返回一个不同的值后,我如何告诉我的
ListBox
再次拉动
DisplayName
属性以刷新其值?

这样做可能需要重新绑定ListBox,松开selectedIndex等

一种解决方法是忽略DisplayMember属性,而是处理ListBox的Format事件。类似于(从记忆中):


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

这起到了作用:

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

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

我知道这是很久以前的事了,但我也遇到了类似的问题,无法找到满意的解决方案,最后在更新值后用这一行解决:

bindingsource.EndEdit();
列表框上的项目反映了在单击“更新”按钮后输入文本框的任何更改。所以在这样的句子之后:

textbox1.DataBindings["Text"].WriteValue();
textbox2.DataBindings["Text"].WriteValue();
只需插入这一行:

bindingsourcevariable.EndEdit();

希望这能帮助其他同样遇到类似问题但尚未找到正确解决方案的人

以下是解决方案代码,它使用XAML而不是后端C#。这就是我如何利用MVVM完成项目(尽量减少后端代码,如果可能的话,没有后端代码)

这是类本身的部分代码片段

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

棘手的部分是,DisplayMemberPath设置为“UserFriendlyName”,而不是“{Binding UserFriendlyName}”这是关键

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

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

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

XAML很棘手

bindingsourcevariable.EndEdit();
 <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"/>
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");
            }
        }
<TextBox x:Name="txtDisplayName" HorizontalAlignment="Left" Height="23" Margin="395,40,0,0" TextWrapping="Wrap" 
                 Text="{Binding ElementName=lstServers,Path=SelectedItem.UserFriendlyName, UpdateSourceTrigger=PropertyChanged}"