2

静的クラスのリポジトリとして機能する静的 IList があります。

//静的クラスの設定

public static IList RecentSearchedRepo = new ObservableCollection<object>();

UIグリッドをバインドする別のクラスにあるIList:

//コンポーネント クラス

private IList recentsearch = new ObservableCollection<object>();
public IList RecentSearch
{
    get
    {
        return recentsearch;
    }
    set
    {
        recentsearch = value;
        RaisePropertyChanged("RecentSearch");
    }
}

オブジェクトを RecentSearchedRepo に追加します。

RecentSearchedRepo.add(searchitem)

次に、RecentSearch を静的リストに設定します

RecentSearch = Settings.RecentSearchedRepo;

XAML スニペット:

<GridLayout:RecentSearchGrid x:Name="recentSearchGrid" ItemsSource="{Binding RecentSearch}" />

UserControl を拡張する RecentSearchGrid クラスのスニペット:

 public IList ItemsSource
 {
     get
     {
         return GetValue(ItemsSourceProperty) as IList;
     }
     set
     {
         SetValue(ItemsSourceProperty, value);
     }
}

private static readonly DependencyProperty ItemsSourceProperty =
                    DependencyProperty.Register("ItemsSource", typeof(IList), typeof(RecentSearchGrid), new PropertyMetadata(null, OnItemsSourcePropertyChanged));


private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
     RecentSearchGrid source = d as RecentSearchGrid;

     if (source != null)
     {
      source.setListforgrid(source.ItemsSource);
     }
}

問題は、最初の項目を UI に追加するRecentSearchedRepoと更新されますが、その後追加するたびに UI が更新されないことです。

4

3 に答える 3

1

それ以外の:

RecentSearch = Settings.RecentSearchedRepo;

やってみてください:

RecentSearch.Clear();
var freshData = Settings.RecentSearchedRepo;
if (freshData != null)
    foreach (var item in freshData)
        RecentSearch.Add(item);

参照を再割り当てすることでバインディングを強制終了していました。

編集:あなたの後

あなたはそれを逆にやっています:それOnItemsSourcePropertyChangedはソースを設定するべきではなく、実際にはそこにあるべきではありません。RecentSearchGrid.xaml で、 RecentSearchGrid.xaml.csで宣言された依存関係プロパティに
バインドする必要がありますItemsSource

于 2013-01-04T17:09:05.247 に答える
0

問題は次 のようになります。インスタンスが変更されない場合、 OnItemsSourcePropertyChangedは呼び出されません。WPFの観点から、RaisePropertyChangeEventを実行しても、バインドされたコレクションのインスタンスが変更されない場合、PropertyChangeハンドラーはまったく呼び出されません。

Settings.RecentSearchedRepoアプリの存続期間を通じて同じインスタンスですか?

于 2013-01-04T18:21:49.240 に答える
0

あなたの質問に答えるのに十分な情報がここにあるとは思いません。次の単純なアプリケーションは、質問で説明されているシナリオを反映しており、期待どおりに機能します。

// MySettings.cs
public static class MySettings
{
    public static IList RecentSearchedRepo = new ObservableCollection<object>();
}

// MyVm.cs
public class MyVm : INotifyPropertyChanged
{
    private IList recentSearch = new ObservableCollection<object>();

    public event PropertyChangedEventHandler PropertyChanged;

    public MyVm()
    {
        this.RecentSearch = MySettings.RecentSearchedRepo;
    }

    public IList RecentSearch
    {
        get { return recentSearch; }
        set 
        { 
            recentSearch = value;
            this.RaisePropertyChanged("RecentSearch");
        }
    }

    private void RaisePropertyChanged(string p)
    {
        if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(p));
    }
}

// MainWindow.xaml.cs
public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.InitializeComponent();

        // Initialization as described in the question
        MySettings.RecentSearchedRepo.Add("SearchItem1");
        MySettings.RecentSearchedRepo.Add("SearchItem2");

        this.DataContext = new MyVm();
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        // Add a new item later
        MySettings.RecentSearchedRepo.Add("NewlyAddedSearchItem");
    }
}

// MainWindow.xaml
<Window x:Class="ScratchWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <Button DockPanel.Dock="Bottom" Content="Add new Search Item" Click="Button_Click_1" />
        <ListBox ItemsSource="{Binding RecentSearch}" />
    </DockPanel>
</Window>

霊能者の帽子をかぶって、間違ったコレクションにアイテムを追加していないか尋ねてみます。単一のアイテムが追加された後、コレクションは再作成されてバインディングに配置されますが、その後のアイテムは新しいコレクションではなく元のコレクションに追加されますか?

RecentSearchGrid が UserControl であると述べたことを考えると、ItemsSource の実装は、ItemsControl から継承される標準のものではなく、カスタムのものである可能性があることも推測できます。どういうわけか、RecentSearchGrid がバインディングを誤って壊している可能性があります。

私はバブーンに同意します。の目的はOnItemsSourcePropertyChanged何ですか? 典型的な実装では、そこにあるとは思いません。

于 2013-01-04T17:21:36.057 に答える