0

我正在尝试将 ListBox 绑定到 ObservableCollection。我不想绑定列表框条目的文本属性和列表框条目的背景。

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 作为背景颜色的开关,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>

添加了项目,但 TextBox 中没有显示文本


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

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

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

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

4

2 回答 2

0

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

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

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

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

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

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

于 2012-08-26T06:13:42.987 回答
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 回答