2017-08-03 16 views
0

学生を形成少しの助けを必要とする:XAMLリストボックス結合一覧別の.csファイル

私は私のメインウィンドウのリストを持って、私のユーザーコントロールにリストボックスにバインドします。原因test_listは特別なものではありませんこれは、未知であるという事実にListbox1.ItemsSource = test_list;を使用することはできません、ユーザーコントロールの.csファイルで

public List<T> test_list; 
    public MainWindow() 
    { 
     InitializeComponent(); 
     test_list= new List<T>(); //creating the list 
     test_list_fill(); // filling the list with some stuff 
    } 

:Listの

私のメインウィンドウコード。 私の質問は、リストボックス1にtest_listを埋め込むための頑丈な方法ですか?

私はいくつかのXAMLを試してみましたが、動作させることはできません。

<ListBox x:Name="Listbox1" 
     ItemsSource="{Binding Source=test_list}" 
     Margin="17,130,17,118" > 

少なくともこれはリストボックスに「test_list」を表示しますが、これは自分のリストの内容ではありません。私は後で内容を表示するために<TextBlock Text="{Binding name}"のようなものが必要であることを知っていますが、私もバインディングを取得しません。 UserControl.csにListbox1.ItemsSource = test_list;を持たないソリューションはありますか?

ありがとうございました。素敵な日にコードを入力してください!

答えて

0

プロパティにします。フィールドとのバインドは機能しません。

public List<T> test_list {get;set;} 

と、また、あなたがあなたの代わりにList<string>ようList<T>TList<int>List<Customer>など

更新されることを望むなら何の種類を提供する必要があります: - あなたのプット:ここではいくつかの他の詳細がありますこのリストはコードビハインドファイルにあります。コントロールのDataContextプロパティにあるオブジェクトでバインディングが行われます。これは通常、別のクラス(これはViewModelと呼ばれます)で、Windowと同じクラスではありません。 -InitializeComponent()の後にリストを作成した場合は、バインディングがすでに完了していて、まだリストが存在しないため、ロードされません。プロパティの変化を検出するには、INotifyPropertyChangedインターフェイスを実装します(オンラインで多くの例があります)。 - 後でリスト内の項目を変更し、その内容をUIに反映させる場合は、List<T>の代わりにObservableCollection<T>を使用し、いくつかの要素が追加または削除されたときに通知します。

ので、完全なソリューションをすることです:あなたはObservableCollectionを使用し、要素を追加/削除します-if INotifyPropertyChangedを実装し、プロパティ のセッターで、そこからイベントを発生させ、それ-makeプロパティtest_list を持つことになります -Create別のクラスListの代わりに。 - このクラスのインスタンスをDataContextに設定します。Windowのプロパティ。

+0

完了。リストボックスにスクロールバーがありますが、値はありません。 'ItemsSource =" {Binding Source = test_list} "'で何かを変更する必要がありますか?このように、 'ItemsSource =" {Binding test_list} "には何もないので、大きな白い梁があります。 – Knoggino

+0

私はいくつかの追加の詳細で答えを更新しました。それはより完成し、詳細な解決策です。あなたが立ち往生したら、私に知らせてください:)また、オンラインMVVMパターンをチェックしてください。 – Shadowed

0

ユーザーコントロールのListBoxItemSourceとなるプロパティをUserControl.csに作成します。 UserControl.csで :ユーザーコントロールで

private ObservableCollection<string> _firstNames = new ObservableCollection<string>(); 
    public ObservableCollection<string> FirstNames { get { return _firstNames; } } 

    public void PopulateNames(IEnumerable<string> names) 
    { 
     foreach (string name in names) 
     { 
      _firstNames.Add(name); 
     } 
    } 

。XAML:今

<ListBox x:Name="listBox" ItemsSource="{Binding FirstNames}"/> 

、親のコンストラクタから:それは内蔵の変更通知機構を備えているので、代わりにList

var names = new List<string>() {"James", "bond"}; 
myusercontrol.PopulateNames(names); 

、あなたがObservableCollectionを使用したいと思うので、あなたが設定した後。 BindingxamlからObservableCollectionに変更すると、追加コードを実行しなくてもUIに反映されます。また、ObservableCollectionを使用する場合、変更がUIに反映されるためには、newを別のものに変更しないでください。最初に作成したものを変更する必要があります。

これは理想的な方法ではありませんが、さらに進むにつれてMVVMパターンを調べる必要があります。これはあなたが頼んだものを解決するはずです。

関連する問題