绑定并更新静态属性

时间:2013-05-25 22:49:27

标签: c# wpf data-binding static

我在谷歌搜索了一个解决方案,但我无法在这里应用我发现的问题,所以我有一个静态属性的静态类,我希望将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。 提前致谢

3 个答案:

答案 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());
            }
        }
    }
}