[英]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.