C# 在不设置DataContext的情况下绑定整个集合对象和子属性

C# 在不设置DataContext的情况下绑定整个集合对象和子属性,c#,wpf,xaml,data-binding,listbox,C#,Wpf,Xaml,Data Binding,Listbox,我正在尝试将列表框绑定到可观察的集合。我不想绑定ListBox条目的文本属性和ListBox条目的背景 列表框在加载的松散xaml文件中定义: <TextBox Margin="0,5,5,5" Text="{Binding Path=TB9P}" Background="LightBlue" Name="DetailsviewTB9" Height="20"> <TextBox.ToolTip> <StackPanel>

我正在尝试将列表框绑定到可观察的集合。我不想绑定ListBox条目的文本属性和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>
基本上,我只想将ListBox绑定到一个LBEntrysCollection,其中SelectedItemP作为背景色的开关,StringP作为文本属性。但我需要其他属性的DetailsViewText上的DataContext

当xaml文件加载StaticResource res_LB1P时,我遇到了一个异常。 如何在ListBox和TextBlock上设置绑定才能使其正确

编辑: 用这个

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

已添加项,但文本框中未显示任何文本


现在我真的很困惑。它确实是这样工作的:

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

很简单,但我想我以前试过这个,但它不起作用

如果一个绑定失败(后台绑定),另一个绑定(文本属性)也可能不工作吗?

为什么不这样做

<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>


如果我不理解你的问题,请纠正我。是否要将列表框的itemssource绑定到文本框的datacontext?

我一直认为ViewModel(datacontext指向的对象)就是视图的模型

所以要解决这个问题,您需要一个对象作为ViewModel,因为只有一个DataContext属性,或者需要添加一个额外的DataContext类属性

第一个选项(一个ViewModel)可以通过创建一个包含ObservableCollection和DetailsViewText的新类来实现:

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

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

第二个选项(额外的DataContext-like属性)可以通过对ListBox进行子分类并添加另一个属性来实现

RelativeSource
遍历树,这不是树关系,因为
工具提示
已断开连接,因此它将失败…因此使用ElementName,我没有注意它在工具提示内。我认为ListBox的DataContext已在DetailsViewText上设置。使用此选项时,会添加“项目”,但文本框中不会显示任何文本
<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>
class ComposedViewModel: INotifyPropertyChanged
{
    public LBEntrysCollection LBEntries
    {
         get { ... }
         set { ... } 
    }

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