添加到ObservableCollection <string>

时间:2015-10-16 12:47:31

标签: c# wpf xaml

编辑:将列表更改为ObservableCollection,获得相同的发布 e

我有一个全局对象,它保存应用程序运行时期间所需的值。出于某种原因,ListView没有被填充,不太确定我是否编码错误,或者ListView是否由于某种原因而没有被更新。

这是班级:

App.xaml.cs

/// <summary>
/// Global values for use during application runtime
/// </summary>
public class runtimeObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

    }
    private ObservableCollection<string> _hashList;
    public ObservableCollection<string> hashList
    {
        get { return _hashList; }
        set
        {
            if (value = "true")
            {
                _hashList.Clear();
            }
            else
            {
                _hashList.Add(value);
                OnPropertyChanged("hashList");
            }
        }
    }
}

我已创建一个命令来填充此List,以便我可以测试它的绑定。这是命令:

Commands.cs

/// <summary>
/// Command: Test
/// </summary>
public static RoutedUICommand Test
{
    get { return _Test; }
} 
public static void Test_Executed(object sender,
            ExecutedRoutedEventArgs e)
{
    var runtime = (runtimeObject)Application.Current.TryFindResource("runtimeVariables");
    runtime.hashList = "ONE";
    runtime.hashList = "ONE";
    runtime.hashList = "ONE";
    runtime.hashList = "ONE";
    runtime.hashList = "ONE";
}
public static void Test_CanExecute(object sender,
                    CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

这是我的ListView与绑定,我绑定它的方式适用于另一个属性上的文本框,我在<local:runtimeObject x:Key="runtimeVariables" />内定义了像App.xaml这样的静态资源 的 MainWindow.xaml

<ListView Height="150" Width="400" ItemsSource="{Binding Source={StaticResource runtimeVariables},Path=hashList}"/>

修改

  

为什么会这样?

  runtime.hashList = new ObservableCollection<string> { "one" }; shouldn't it be:

 runtime.hashList.Add("one"); ?

这就是我的意思,但是如果我改变的话 runtime.hashList = new ObservableCollection<string> { "five" }; 对此 runtime.hashList.Add("one");

如何在class属性中处理它?

else
{
    _hashList.Add(value);
    OnPropertyChanged("hashList");
}

我收到此错误:

  

参数1:无法转换   &#34; System.Collections.ObjectModel.ObservableCollection&#34;至   &#34;串&#34;

编辑2: 我希望能够将一个字符串发送到我的类属性,这样我可以简单地向我的List添加一个新值,或者清除它,但它需要在请求时返回List。

但是我不能这样做吗?为了返回ObservableCollection<string>我需要像这样设置它:

public ObservableCollection<string> hashList { }

但这并不允许我只发送字符串数据,因为它无法将字符串转换为System.Collections...

如果这是有道理的。

4 个答案:

答案 0 :(得分:2)

您正在为<script src="http://connect.facebook.net/fr_FR/all.js"></script> <fb:login-button show-faces="false" scope="email,user_birthday,user_location" size="medium">Facebook </fb:login-button> FB.api('/me?', { fields: 'name, email, gender,first_name,last_name,birthday,location' }, function(response) { console.log(response); }); 提出PropertyChanged,但hashList实例未发生变化,只有hashList的内容发生了变化。 WPF具有内置的优化功能,可以防止在对象实际未发生更改时发生任何更新。

如果您希望WPF响应列表内容的更改,则需要触发hashList,而最简单的方法是使用CollectionChanged代替ObservableCollection }。

答案 1 :(得分:1)

ListView不知道列表中添加了新值,因为List<T>没有实现INotifyPropertyChanged接口。 您有以下选择:

  • 您可以将List<T>课程更改为ObservableCollection<T>课程。
  • 您可以创建自己的列表类来实现INotifyPropertyChanged
  • 您可以在对象列表中填充OnPropertyChanged
  • 您可以在ListView实例化之前用值填充列表。

编辑:

为什么会这样?

      runtime.hashList = new ObservableCollection<string> { "one" };

不应该是:

     runtime.hashList.Add("one");

答案 2 :(得分:1)

在这种情况下,您不需要INotifyPropertyChanged来更新ListView。替换整个对象时使用该事件,即用完全不同的集合替换集合。您真正感兴趣的是在项目添加到集合或从集合中删除时更新ListView。这是通过完全不同的事件来处理的:INotifyCollectionChanged。如果将ItemsSource绑定到实现该事件的集合,则ListView将在集合更改时自动更新。 ObservableCollection实现了该事件,因此这是您要使用的集合。

我会将此runtimeObject替换为:

public class runtimeObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

    }

    private readonly ObservableCollection<string> _hashList = new ObservableCollection<string>();
    public ObservableCollection<string> hashList
    {
        get { return _hashList; }
    }
}

然后将您的Test-Executed方法更改为:

public static void Test_Executed(object sender, ExecutedRoutedEventArgs e)
{
    var runtime = (runtimeObject)Application.Current.TryFindResource("runtimeVariables");
    runtime.hashList.Add("one");
    runtime.hashList.Add("two");
    runtime.hashList.Add("three");
    runtime.hashList.Add("four");
    runtime.hashList.Add("five");
}

答案 3 :(得分:1)

你的问题在这里:

var runtime = (runtimeObject)Application.Current.TryFindResource("runtimeVariables");
runtime.hashList = new ObservableCollection<string> { "one" };
runtime.hashList = new ObservableCollection<string> { "two" };
runtime.hashList = new ObservableCollection<string> { "three" };
runtime.hashList = new ObservableCollection<string> { "four" };
runtime.hashList = new ObservableCollection<string> { "five" };
runtime.hashList = new ObservableCollection<string> { "six" };

每次,您都在创建一个新列表。您希望将ObservableCollection分配给runtime.hashList属性一次,然后将每个字符串添加到集合中:

var runtime = (runtimeObject)Application.Current.TryFindResource("runtimeVariables");
runtime.hashList.Add( "one" );
runtime.hashList.Add( "two" );
runtime.hashList.Add( "three" );
runtime.hashList.Add( "four" );
runtime.hashList.Add( "five" );
runtime.hashList.Add( "six" );

ObservableCollection类实现另一个名为INotifyCollectionChanged的接口,该接口遵循类似于INotifyPropertyChanged的模式,只要每当集合的内容发生更改时它都会引发OnCollectionChanged事件。 WPF侦听对该事件的集合的更改并适当地更新显示。