こんにちは、私は Visual Studio 2010 を WPF で使用し、C# をモデル ビュー プレゼンター パターンで使用しています。
しかし、いくつかの問題があります。ユーザーが挿入したいくつかの基準に基づいて、監視可能なコレクションをフィルタリングする検索機能があります。
public void Search(string criteria)
{
if (!string.IsNullOrEmpty(criteria) && criteria.Length > 2)
{
var rez = from ua in _listAdress
where ua.Naziv.ToUpper().IndexOf(criteria.ToUpper()) >= 0 || ua.InventurniBroj.ToString() == criteria
select ua;
//var rez = from ua in _listAdress
// where ua.Naziv.ToUpper() == criteria.ToUpper() || ua.InventurniBroj.ToString() == criteria
// select ua;
//ListAdress = new ObservableCollection<Adress>(_adressRepository.FindByLookup(criteria));
UbrzajAdress = new ObservableCollection<Adress>(rez);
StatusText = string.Format("{0} zaduzenih pronađeno.", UbrzajAdress.Count);
}
else
{
//ListAdress = new ObservableCollection<Adress>(_adressRepository.ListOprema());
var rez = from ua in _listAdress
select ua;
UbrzajAdress = new ObservableCollection<Adress>(rez);
StatusText = "Prikaz svih zaduzenih.";
}
for (int i = 0; i < this.View.tabs.Items.Count; i++)
{
OpremaListView tab = (OpremaListView)this.View.tabs.Items[i];
if (tab != null && tab.Name != null && tab.Name.Equals("Sva Oprema"))
//if (tab.Header.Equals("Sva Oprema"))
{
OpremaListView opremaListView = (OpremaListView)tab.Content;
OpremaListPresenter opremaListPresenter = opremaListView.Presenter;
opremaListPresenter.refresh();
}
}
}
そして、更新方法は次のとおりです。
public void refresh()
{
this.View.dg.ItemsSource = _applicationPresenter.UbrzajAdress;
}
これですべて動作します。しかし、これはタブ用です。これは、私のアプリケーションのほとんどがどのように構成されているかです。残念ながら、私のアプリでは大量のデータとタブの動作が新しいウィンドウよりもはるかに遅いため、最大のリストは WPF データ グリッドの新しいウィンドウに表示されます。
検索を変更してウィンドウをアップグレードしようとすると、コンパイルしても更新されないため、新しい行を入力してその行を検索しても表示されません。
ウィンドウで機能するように変更しようとした検索は次のとおりです。
public void Search(string criteria)
{
if (!string.IsNullOrEmpty(criteria) && criteria.Length > 2)
{
var rez = from ua in _listAdress
where ua.Naziv.ToUpper().IndexOf(criteria.ToUpper()) >= 0 || ua.InventurniBroj.ToString() == criteria
select ua;
//var rez = from ua in _listAdress
// where ua.Naziv.ToUpper() == criteria.ToUpper() || ua.InventurniBroj.ToString() == criteria
// select ua;
//ListAdress = new ObservableCollection<Adress>(_adressRepository.FindByLookup(criteria));
UbrzajAdress = new ObservableCollection<Adress>(rez);
StatusText = string.Format("{0} zaduzenih pronađeno.", UbrzajAdress.Count);
}
else
{
//ListAdress = new ObservableCollection<Adress>(_adressRepository.ListOprema());
var rez = from ua in _listAdress
select ua;
UbrzajAdress = new ObservableCollection<Adress>(rez);
StatusText = "Prikaz svih zaduzenih.";
}
for (int i = 0; i < this.View.tabs.Items.Count; i++)
{
TestWindow tab = (TestWindow)this.View.tabs.Items[i];
if (tab != null && tab.Title != null && tab.Title.Equals("Sva Oprema"))
//if (tab.Header.Equals("Sva Oprema"))
{
TestWindow opremaListView = (TestWindow)tab.Content;
TestWindowPresenter opremaListPresenter = opremaListView.presenter;
opremaListPresenter.refresh();
}
}
}
これはコンパイルされますが、更新も何もしません。リフレッシュは次のとおりです。
public void refresh()
{
this.View.dg.ItemsSource = _applicationPresenter.UbrzajAdress;
}
もう 1 つの興味深い点は、新しいアイテムを追加する前にアイテムを検索してからすべての oprema を表示すると、検索テキスト ボックス内のすべてを削除してから [検索] をクリックすると、次のエラーでプログラムがクラッシュすることです: Invalid Cast Exception was unhandled Unable to cast 'System.Windows.Controls.TabItem' 型のオブジェクトを 'Inventar.Views.OpremaListView' 型に変換します。
これは、プログラムでタブが開いていないために失敗したことに関係していると思いますが、修正方法がわかりません。助けていただければ幸いです。とにかく、私は何をすべきかを理解していないので、私が得ることができる助けを探しています。ありがとう