在XAML中正确设置绑定源

时间:2016-08-24 08:52:24

标签: c# .net wpf xaml binding

我希望在每个文本框旁边都有一个带有ComboBox的TextBlocks列表。 ComboBox的数据源对于每个ComboBox应该是相同的。但是每个TextBlock都应该包含List的后续元素 ComboBoxs和TextBlocks的数据源都在我的"设置"宾语。所以我将整个窗口的DataContext设置为此设置对象。

这是我的问题: TextBlock的数据源是:名为Fields的列表,它位于名为" Header"的对象内部。类型"线" (当然在设置对象中,这是我的datacontext)。

所以,图形化: 设置(类型:设置) - 标题(类型:CsvLine) - 字段(类型:字符串列表)

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

的List

图形: 设置(类型:设置) - 标签(类型:字符串列表)

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

这是我的代码:

<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,因为我认为它应该是TextBoxes和ComboBoxes的共同源,但它们唯一的常见来源是设置对象 - 但我已经将它设置为我的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;

}

1 个答案:

答案 0 :(得分:1)

所以,我不是百分之百确定你想要什么,但以下内容应该让你开始。

首先,您需要确保绑定到公共属性 - 而不是公共成员 - 因此需要将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>

希望它有所帮助。

相关问题