繁体   English   中英

在XAML中正确设置绑定源

[英]Setting binding source properly in XAML

我想在每个旁边都有一个带有ComboBox的TextBlocks列表。 每个组合框的组合框的数据源都应该相同。 但是,每个TextBlock都应包含List的后续元素。ComboBoxs和TextBlocks的数据源都在我的“设置”对象中。 因此,我将整个窗口的DataContext设置为此设置对象。

这是我的问题:TextBlock的数据源是:名为Fields的列表,该列表位于类型为“ Line”的名为“ Header”的对象内(当然,该对象位于settings对象内,这是我的datacontext)。

因此,以图形方式:设置(类型:设置)-标题(类型:CsvLine)-字段(类型:字符串列表)

现在是ComboBox。 每个ComboBox的数据源都应该是一个称为标签的列表

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

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

这是我的代码:

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

}

因此,我不是100%地确定您想要什么,但是以下内容应该可以帮助您入门。

首先,您需要确保绑定到公共属性,而不是公共成员,因此CsvLine.Fields成员需要更改为public List<string> Fields { get { return _fields; } set { _fields = value; } } public List<string> Fields { get { return _fields; } set { _fields = value; } } 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>

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM