.net 绑定情况下的ItemsSource与DataContext

gmxoilav  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(142)

我的主要问题是关于场景中的绑定情况,我们有多个控件源(datagrid中的组合框)(或者同时有datagrid和itemssource)。那么我们如何知道绑定将使用哪个源?(任何语法来澄清这一点)
假设一个数据网格有一个itemssource=“List of Players”ontext =“Manager”,并且有一个组合框作为一种列。我们还假设每个玩家都有一个Inventory属性,它是一个集合类型。
然后在datagrid.列中:
1.每一列的当前源(用于绑定)是一个播放器(这是我到目前为止的理解)。我们只能绑定到播放器的属性,而不能绑定到播放器上下文“manager”的属性。没有办法绑定到“Manager”的属性。我是正确的吗?
1.然而,如果我们移动到combobox列,然后假设我将让combobox的itemssource ='player 's inventory',那么comboboxItem的当前源将是inventory中的每个项目。如果我使用绑定,它只能绑定到这些项目的属性。然而,有时候我会看到代码,我们也可以绑定到组合框的属性中的播放器的属性,特别是Selected Value和SelectedItem。我有点困惑你能帮帮我吗?
谢谢你

2eafrhcq

2eafrhcq1#

要考虑的关键控件是**ItemsControlComboBox继承自ItemsControlDataGrid的行为非常相似)。
ItemsControlIEnumerable类型的
ItemsSource属性。它也有ItemTemplate属性。它将做的是ItemsSource中的每个项目创建一个ItemTemplate的副本**。ItemTemplate的**DataContext将是ItemsSource中的每个项目**。
ComboBox的例子中,DataGrid列的DataContext将是Player对象。如果将ComboBoxItemSource绑定到Player的库存,那么您将获得ComboBox列表中的每个项目。
需要注意的是,ComboBox本身的**DataContext是不变的**。它仍然是Player对象。如果你为ComboBox指定了ItemTemplate,那就是将它的DataContext添加到Player的库存中。

fivyi3re

fivyi3re2#

它真的很简单。
DataContext引用项目的相同属性。它不会被扩展,也不是动态的。DataContext应用于当前在父级中的子级属性。
但是ItemsSource是动态的,它会随着源代码沿着扩展,下面是一个很好的例子。
这是一个示例xaml。

<UserControl x:Class="SilverlightApplication"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.Resources>           
        <DataTemplate x:Key="template2">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="img1" Source="{Binding Image}"></Image>
                <TextBlock x:Name="data2" Text="{Binding Data}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>
    <StackPanel>
        <StackPanel x:Name="DataContextStack" Orientation="Vertical">
            <TextBlock x:Name="data1" Text="{Binding Text1}"></TextBlock>
            <TextBlock x:Name="data2" Text="{Binding Text2}"></TextBlock>
        </StackPanel>
        <ListBox x:Name="lst2" ItemTemplate="{StaticResource template2}"></ListBox>
    </StackPanel>
</Grid>

字符串
下面是后面的代码。

namespace SilverlightApplication
 {
  public partial class MainPage : UserControl
 {
    public MainPage()
    {
        InitializeComponent();
        loadLists();
    }

    private void loadLists()
    {
        ObservableCollection<Temp2> tColl = new ObservableCollection<Temp2>();            

        Temp1 t1 = new Temp1();
        t1.Text1 = "DataContext1";
        t1.Text2 = "DataContext2";            

        tColl.Add(new Temp2() { Image = "", Data = "Item1" });
        tColl.Add(new Temp2() { Image = "", Data = "Item2" });

        DataContextStack.DataContext = t1;
        lst2.ItemsSource = tColl;            
    }
}

public class Temp1
{
    public string Text1 { get; set; }
    public string Text2 { get; set; }
    

}

public class Temp2
{
    public string Image { get; set; }
    public string Data { get; set; }
}
}


正如您所看到的,DataContext应用于存在于StackPanel中的Textblocks,并引用一个单独的属性Text。
而ItemsSource引用Textblock的Image和Text属性的Source,列表中的项可以沿着ObservableCollection扩展。
或者让它对你来说更简单。
DataContext - Value基于设计设置。ItemsSource - Value基于逻辑设置。
希望这对你有帮助。
如果这回答了你的问题,请将其标记为答案。

相关问题