我在谷歌搜索了一个解决方案,但我无法在这里应用我发现的问题,所以我有一个静态属性的静态类,我希望将ListView静态属性绑定到一个ObservableCollection属性,这是已完成,但现在我想通过ObservableCollection
中发生的更改通知ListView public static class Global
{
public static ObservableCollection<Dictionary<string,Dictionary<string,object>>> operations;
ObservableCollection<String> names = new ObservableCollection<string>();
public static ObservableCollection<String> _Operations
{
get
{
for (int i = 0; i < Global.operations.Count; i++)
{
if (Global.operations.Count != 0)
{
names.Add(Global.operations[i].Keys.First().ToString());
}
}
return names;
}
set
{
if (_Operations != value)
{
_Operations = value;
}
}
}
}
然后是XAML
<ListView Name="list" ItemsSource="{Binding Source={x:Static s:Global._Operations}}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding }" />
<Button Content="Delete" Click="Button_Click"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这是删除的代码,我确定它会添加和删除,因为我可以立即看到“操作”被添加或删除效果
var item = ((Button)sender).DataContext;
var itemIndex = list.Items.IndexOf(item);
Global.operations.RemoveAt(itemIndex);
list.Items.Refresh();
这个绑定和显示,显然我需要在删除/添加项目到静态ObservableCollection时更新ListView。 提前致谢
答案 0 :(得分:0)
您可以将Global
更改为单身人士并实施INotifyPropertyChanged
。像这样:
public class Global : INotifyPropertyChanged
{
private static Global _instance = new Global();
public static Global Instance { get { return _instance; } }
private ObservableCollection<string, Dictionary<string, Dictionary<string, object>>> operations = new ObservableCollection<string, Dictionary<string, Dictionary<string, object>>>();
public ObservableCollection<string> _Operations
{
get
{
// ...
}
set
{
// ...
OnPropertyChanged("_Operations");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName);
}
}
你可以像这样设置绑定:
<ListView Name="list" DataContext="{x:Static Global.Instance}" ItemsSource="{Binding Path=_Operations}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding }" />
<Button Content="Delete" Click="Button_Click"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
答案 1 :(得分:0)
通过设置代码的方式,我想要强制刷新的唯一方法是将ItemsSource设置为null,然后再设置ItemsSource
您正在更改操作,但不是您的列表视图绑定到的_Operations,这就是问题所在。使用以下代码,它应该可以工作。
var item = ((Button)sender).DataContext;
var itemIndex = list.Items.IndexOf(item);
Global.operations.RemoveAt(itemIndex);
list.ItemsSource = null;
list.ItemsSource = Global._Operations;
答案 2 :(得分:0)
如果使用以下内容替换Global类,则对操作对象进行的添加/删除将传播到_names,绑定将正常工作。
如果您需要分配给Global.operation(例如需要订阅新的CollectionChanged事件),则需要附加代码,但可能您可以修改现有代码,只需在Global.operation中添加/删除。
public static class Global
{
public static ObservableCollection<Dictionary<string, Dictionary<string, object>>> operations = new ObservableCollection<Dictionary<string, Dictionary<string, object>>>();
static ObservableCollection<String> names = new ObservableCollection<string>();
public static ObservableCollection<String> _Operations
{
get
{
return names;
}
}
static Global()
{
operations.CollectionChanged += operations_CollectionChanged;
}
static void operations_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.OldItems != null)
{
foreach (Dictionary<string, Dictionary<string, object>> value in e.OldItems)
{
_Operations.Remove(value.Keys.First().ToString( ));
}
}
if (e.NewItems != null)
{
foreach (Dictionary<string, Dictionary<string, object>> value in e.NewItems)
{
_Operations.Add(value.Keys.First().ToString());
}
}
}
}