更新ListBox的DisplayMember

时间:2011-01-28 18:33:22

标签: c# winforms

这个问题涉及一个极小的Winforms GUI。让我们知道我有数据绑定和INotifyPropertyChanged的基本知识,并在WPF的ViewModels中使用它们。但我不知道Winforms。这是为了学校作业。

所以我有一个具有DisplayName属性的类。我还有一个ListBoxItems是我班级的一系列实例。我指出了myListBox.DisplayMember = "DisplayName";在我的类实例中更改了一个值,导致DisplayName属性返回不同的值后,如何告诉我的ListBox拉{{1}再次刷新属性?

4 个答案:

答案 0 :(得分:3)

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

这有效:

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

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

答案 1 :(得分:2)

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

一种解决方法是忘记DisplayMember属性并改为处理ListBox的Format事件。像(来自记忆):

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

答案 2 :(得分:0)

我知道这是很久以前但是我有类似的问题,找不到令人满意的解决方案,最后在更新值后最后解决了这一行:

bindingsource.EndEdit();

列表框上的项目反映了在单击“更新”按钮后输入到文本框中的任何更改。所以在这样的行之后:

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

只需插入此行:

bindingsourcevariable.EndEdit();

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

答案 3 :(得分:0)

这是解决方案代码,它在XAML中执行所有操作,而不是后端C#。这就是我使用MVVM进行项目的方法(最小化后端代码,如果可能的话,没有后端代码)

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");
            }
        }

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

Servers是一个具有名为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}" 

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

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

这里的棘手的部分是将DisplayMemberPath设置为&#34; UserFriendlyName&#34;而不是&#34; {绑定UserFriendlyName}&#34;。 这是关键

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

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

{{1}}

VerticalAlignment =&#34;顶&#34;宽度=&#34; 240&#34; /&GT;

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

XAML很棘手!