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