【问题标题】:Binding an entire collection object and subproperties without setting DataContext在不设置 DataContext 的情况下绑定整个集合对象和子属性
【发布时间】:2012-08-21 01:23:35
【问题描述】:

我正在尝试将 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 上设置我的 Binding 以使其正确?

编辑: 有了这个

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

很简单,但我以为我以前尝试过,但它不起作用......

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

【问题讨论】:

    标签: c# wpf xaml data-binding listbox


    【解决方案1】:

    为什么不这样做?

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

    【讨论】:

    • RelativeSource 走树,这不是树关系,因为ToolTip 已断开连接,因此它将失败...
    • 所以用ElementName,没注意是在ToolTip里面。
    • 我认为 ListBox 的 DataContext 已经设置在 DetailsViewText 上。使用此 ' 项目已添加,但文本框中没有显示文本
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2011-01-03
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多