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