在XAML中正确设置绑定源

本文关键字:设置 绑定 XAML | 更新日期: 2023-09-27 18:03:55

我想有一个列表的textblock与组合框旁边的每一个。每个ComboBox的数据源应该是相同的。然而,每个TextBlock应该包含List的顺序元素两个数据源的组合框和文本块都在我的"设置"对象。因此,我将整个窗口的DataContext设置为这个设置对象。

我的问题是:TextBlock的数据源是:名为字段的列表,它是在一个名为"Header"的类型为"Line"的对象内(当然是在设置对象内,这是我的数据上下文)。

所以,图形:settings(type: settings) - Header(type: CsvLine) - Fields(type: List of string)

现在组合框。每个ComboBox的数据源应该是一个名为Tags

的List

图形:settings(type: settings) - Tags(type: List of string)

我不知道我应该如何指向这些位置,我尝试了很多选项,但没有一个工作。我只看到一个空白的窗口。

下面是我的代码:

<Grid>
    <StackPanel Orientation="Horizontal">
        <ItemsControl ItemsSource="{Binding Headers}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Fields}"/>
                        <ComboBox ItemsSource="{Binding DataContext.Tags,
                            RelativeSource={RelativeSource AncestorType=ItemsControl}}">
                        </ComboBox>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Grid>

我不知道我应该把ItemsSource传递给ItemsControl,因为我认为它应该是textbox和combobox的共同来源,但它们唯一的共同来源是设置对象-但我已经把它设置为我的DataContext。我在ComboBox中使用过RelativeSource,但我不太确定它的用途(尽管我在MSDN上读过一篇关于它的文章)。我不知道为什么,但是我真的很难理解绑定——我正在努力让任何东西工作。

//编辑:这是我的设置类-它是我的设置对象的类型:

public class Settings
{
    public CsvLine AllHeaders1
    {
        get
        {
            return _allHeaders1;
        }
    }
    public CsvLine _allHeaders1 = new CsvLine()
    {
        Fields = new List<string>()  
        { 
           "Header1" , "Header2" , "Header3" 
        }
    };
    private List<String> _tags;
    public List<String> Tags
    {
        get
        {
            return new List<string>() { "Tag1", "Tag2", "Tag3", "Tag4", "Tag5" };
        }
        set
        {
            _tags = value;
        }
    }
}
这是我的CsvLine类:
public class CsvLine
{
    public List<string> Fields = new List<string>();
    public int LineNumber;
}

在XAML中正确设置绑定源

所以,我不是100%确定你想要的是什么,但以下应该可以让你开始。

首先,您需要确保绑定到公共属性—而不是公共成员—所以CsvLine。Fields成员需要修改为public List<string> Fields { get { return _fields; } set { _fields = value; } }。同样,如果你想让设置对象的更改反映在UI中,你需要实现INotifyPropertyChanged。

无论如何,将其放置并分配给网格的DataContext,下面将显示文本块的垂直列表(显示"Header 1","Header 2","Header 3"),每个文本块的右侧都有一个组合框,其中包含值"Tag1","Tag2"…"Tag5"。

<Grid x:Name="SourceGrid">
    <ItemsControl ItemsSource="{Binding Path=AllHeaders1.Fields}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" />
                    <ComboBox ItemsSource="{Binding ElementName=SourceGrid, Path=DataContext.Tags}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

希望能有所帮助。