0

ListBox を ObservableCollection にバインドしようとしています。ListBox エントリの Text プロパティと ListBox エントリの Background をバインドしたくありません。

ListBox は、読み込まれた緩い xaml ファイルで定義されます。

<TextBox Margin="0,5,5,5" Text="{Binding Path=TB9P}" Background="LightBlue" Name="DetailsviewTB9" Height="20">
        <TextBox.ToolTip>
            <StackPanel>
                <Label FontWeight="Bold" Background="Blue" Foreground="White">Daten</Label>
                <ListBox ItemsSource="{Binding Source={StaticResource res_LB1P}}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                                <TextBlock Text="{Binding Path=StringP}" Background="{Binding Path=SelectedItemP, Converter={StaticResource c_SelectedItemToBackgroundConverter}}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
        </TextBox.ToolTip>
    </TextBox>

DataContext はクラス DetailsViewText で設定されます

public class LBEntry
{
    bool DetailsViewLBSelectedItem = true;

    string DetailsViewLB = "test";

    public LBEntry(bool selcected, string str)
    {
        DetailsViewLB = str;
        DetailsViewLBSelectedItem = selcected;
    }

    public bool SelectedItemP
    {
        get { return DetailsViewLBSelectedItem; }
        set { DetailsViewLBSelectedItem = value; }
    }

    public string StringP
    {
        get { return DetailsViewLB; }
        set { DetailsViewLB = value; }
    }
}

public class LBEntrysCollection : System.Collections.ObjectModel.ObservableCollection<LBEntry>
{
    //
}

public class DetailsViewText
{
    string[] DetailsViewTB1_Text = new string[20];
    bool[] fDetailsViewCB = new bool[20];


    LBEntrysCollection[] LBEntrys = new LBEntrysCollection[]{
            new LBEntrysCollection{ new LBEntry(false, "test"), new LBEntry(true, "test") },
            new LBEntrysCollection{ new LBEntry(true, "test") },
            new LBEntrysCollection{ new LBEntry(false, "test") },
            new LBEntrysCollection{ new LBEntry(false, "test") },
            new LBEntrysCollection{ new LBEntry(false, "test") }
    };

    public LBEntrysCollection LB1P
    {
        get { return LBEntrys[0]; }
        set { LBEntrys[0] = value; }
    }

    public string TB9P
    {
        get { return DetailsViewTB1_Text[8]; }
        set { DetailsViewTB1_Text[8] = value; }
    }

    ...
    }

リソース res_LB1P は mainWindow コンストラクターで設定されます。

// Resources
        this.Resources.Add("res_LB1P", detailsViewFrameHandling.DetailsViewTextP.LB1P);

基本的には、SelectedItemP を背景色のスイッチとして、StringP をテキスト プロパティとして使用して、ListBox を LBEntrysCollection にバインドしたいだけです。しかし、他のプロパティの DetailsViewText に DataContext が必要です。

xaml ファイルが StaticResource res_LB1P をロードしているときに例外が発生します。ListBox と TextBlock に Binding を正しく設定するにはどうすればよいですか?

編集: これで

<ListBox ItemsSource="{Binding Path=LB1P}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                                <TextBlock Text="{Binding Path=LB1P.StringP}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
                </ListBox>

アイテムが追加されましたが、TextBox にテキストが表示されません


今、私は本当に混乱しています。次のように機能します。

<ListBox ItemsSource="{Binding Path=LB1P}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                                <TextBlock Text="{Binding Path=StringP}" Background="{Binding Path=SelectedItemBrushP}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                </ListBox>

十分に単純ですが、以前にこれを試したことがあると思っていましたが、うまくいきませんでした...

1 つのバインディング (バックグラウンド バインディング) が失敗した場合、他のバインディング (テキスト プロパティ) も機能しない可能性はありますか?

4

2 に答える 2

0

なぜこれをしないのですか?

<ListBox ItemsSource="{Binding ElementName=<TextBox's Name>, Path=DataContext">
            <ListBox.ItemTemplate>
                <DataTemplate>
                            <TextBlock Text="{Binding Path=StringP}" Background="{Binding Path=SelectedItemP, Converter={StaticResource c_SelectedItemToBackgroundConverter}}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
            </ListBox>

あなたの質問を理解するのに間違っている場合は、私を修正してください。リストボックスのアイテムソースをテキストボックスのデータコンテキストにバインドしたいですか?

于 2012-08-26T02:53:10.553 に答える
0

私は常に、ViewModel (DataContext が指すオブジェクト) を単なるビューのモデルであると考えてきました。

したがって、これを解決するには、DataContext プロパティが 1 つしかないため ViewModel になるオブジェクトを 1 つ必要とするか、DataContext のようなプロパティを追加する必要があります。

最初のオプション (1 つの ViewModel) は、ObservableCollection と DetailsViewText の両方を含む新しいクラスを作成することで実現できます。

class ComposedViewModel: INotifyPropertyChanged
{
    public LBEntrysCollection LBEntries
    {
         get { ... }
         set { ... } 
    }

    public DetailsViewText Details
    {
        get { ... }
        set { ... }
    }
}

2 番目のオプション (余分な DataContext のようなプロパティ) は、ListBox をサブクラス化し、別のプロパティを追加することで実現できます。

于 2012-08-26T06:13:42.987 に答える