编辑:将列表更改为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...
如果这是有道理的。
答案 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
后编辑:
为什么会这样?
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侦听对该事件的集合的更改并适当地更新显示。