绑定整个集合对象和子属性而不设置DataContext

时间:2012-08-26 01:34:05

标签: c# wpf xaml data-binding listbox

我正在尝试将ListBox绑定到ObservableCollection。我不想绑定ListBox的文本属性和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>

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

基本上我只想将ListBox绑定到LBEntrysCollection,其中SelectedItemP作为背景Color的开关,StringP作为Text属性。但我需要DetailsViewText上的DataContext用于其他Propertys。

我在xaml文件加载StaticResource res_LB1P时遇到异常。 如何在ListBox和TextBlock上设置我的绑定以使其正确?

修改 有了这个

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

很简单,但我以为我以前试过这个并且它没有用......

是否有可能,如果一个Binding失败(背景绑定),另一个绑定(文本属性)也不起作用?

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:0)

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

因此,要解决此问题,您需要一个将成为ViewModel的对象,因为只有一个DataContext属性,或者您需要添加一个额外的类DataContext属性。

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

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

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

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