0

コード ビハインドでリスト ボックスを観察可能なコレクションにバインドしたいと考えています。これは私がバインディングに使用しているものです:

Binding binding = new Binding();
binding.Source = symTable;
substanceList.SetBinding(ListBox.ItemsSourceProperty, binding);

symTableから継承するObservableCollectionと、Count プロパティが適切に更新されるため、要素を正しく追加していることはわかっていますが、リスト ボックスはそうではありません。XAMLではリスト全体にバインドされているため、パスを何に設定すればよいかわかりませんでした。

注: ListBox に個々の項目を追加すると、それらが表示されるため、表示上の問題ではありません。私も試しました:

this.Resources.Add("symTable", symTable);

ウィンドウコンストラクターで、次にこれ:

しかし、リソースを解決できないと言われています。

また、XAML でリソースとして追加しようとしましたが、再び機能しませんでした: //ウィンドウのリソースで。

<s:SymbolTable x:Key="symTable"/> 
...
<ListBox x:Name="substanceList" ItemsSource="{Binding Source={StaticResource symTable}}"/>

そしてコードビハインドで:

symTable = (SymbolTable)this.FindResource("symTable");

ElementNameコードビハインドまたはXAMLでこれを行う他の方法を知っている人はいますか?コードビハインドで定義されたオブジェクトを参照していると思います。

symTable のクラス定義の一部を次に示します。

public class SymbolTable : ObservableCollection<Substance>
{
    Dictionary<string, Substance> symbolTable;
    ...
    public Substance Insert(Substance s)
    {

        if (!symbolTable.ContainsKey(s.Name))
        {
            symbolTable.Add(s.Name, s);
            Items.Add(s);
        }

        return symbolTable[s.Name];
    }

わかりましたので、最も奇妙なことに気付きました。Items.Addは INotifyChanged イベントを発生させていませんでした。私は Insert メソッドで Items.Add を使用しました。Items.Add は INotifyChanged イベントを発生させないため、ListBox は更新されていないと推測していますが、Items.Add の代わりに Add を実行すると、機能しました。これが実際に当てはまるかどうか知っていますか?

4

3 に答える 3

1

質問へのコメントに続いて、SymbolTableをXAMLのリソースとして宣言する方法と、ListBoxをそれにバインドする方法を説明します。XAML名前空間宣言'local'に注意してください。これはListBindingTest、テストプロジェクトで名前が付けられているローカル名前空間/アセンブリを参照しています。

<Window x:Class="ListBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListBindingTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:SymbolTable x:Key="symTable"/>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Source={StaticResource symTable}}"/>
    </Grid>
</Window>

次のように、ウィンドウクラスのコードビハインドでSymbolTableリソースにアクセスできます。

SymbolTable st = (SymbolTable)Resources["symTable"];
st.Add(new Substance());
于 2012-01-27T23:52:31.843 に答える
0

リストボックスに ItemSource を直接設定することもできます。

substanceList.ItemsSource = symTable;
于 2012-01-27T22:47:22.153 に答える
0

DisplayMemberPath は、symTable のパブリック プロパティである必要があります。

于 2012-01-27T22:21:23.890 に答える