我有一个通过LINQ绑定到数据源的itemscontrol。我正在尝试创建一个可重复的控件,a)显示从LINQ查询返回的记录,b)允许用户添加新行。
我有两个系列:
a)fareItemCollection它包含一个fareItem对象的集合,其中包括fareDate和PermitNumber。
b)permitNumbers这是一个不可数的
我可以在可重复的itemsControl中显示票价项目。我希望能够将许可证号码显示为permitNumbers的下拉列表(即组合框),其中permitNumber用于选择该票价。如果用户希望,用户应该能够选择不同的许可证编号以分配给该fareItem。
我通过LINQ检索所需数据没有问题,这是我如何绑定我正在努力解决的组合框中的permitNumbers数据。我理解如何正常地将数据集绑定到组合框,但是当它位于绑定到另一个源的项控件内时。这甚至可能还是有其他办法解决这个问题?
这是我的xaml到目前为止 - 注意PermitNumbers是我的iEnumerable的名字,它是窗口类中的公共属性:
<ItemsControl Name="fareItemsControl" ItemsSource="{Binding}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="160" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Column="0" Grid.Row="0">
<TextBlock>Date</TextBlock>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="0">
<TextBlock>Driver</TextBlock>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="1">
<TextBlock Text="{Binding FareDate, StringFormat={}\{0:dd/MM/yy\}, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource FormFieldTextBoxStyle}">
</TextBlock>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="1">
<ComboBox ItemsSource="{Binding Path=PermitNumbers, UpdateSourceTrigger=PropertyChanged}" IsEditable="True"></ComboBox>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Style.Triggers>
<Trigger Property="HasItems" Value="false">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="160" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Column="0" Grid.Row="0">
<TextBlock>Date</TextBlock>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="0">
<TextBlock>Driver</TextBlock>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="1">
<DatePicker SelectedDate="{Binding FareDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource datePickerStyle}"> </DatePicker>
</StackPanel>
<StackPanel Grid.Column="1" Grid.Row="1">
<ComboBox ItemsSource="{Binding Path=PermitNumbers, UpdateSourceTrigger=PropertyChanged}" IsEditable="True"></ComboBox>
</StackPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
</ItemsControl>
由于 凯
更多信息: 以下是我在fareObjectsCollection中使用的fareObject,它绑定到上面的fareItemsControl:
public class FareProxy
{
DateTime _fareDate;
public DateTime FareDate
{
get
{
return _fareDate;
}
set
{
_fareDate = value;
}
}
IEnumerable<string> _permitNumbers;
public IEnumerable<string> PermitNumbers
{
get
{
return _permitNumbers;
}
set
{
_permitNumbers = value;
}
}
}
对于每个票价项目,日期在项目控件中正确显示,但permitNumbers不会绑定到permitNumbers组合框。我尝试在我正在使用的窗口的类中创建permitNumbers属性,并通过将comboBox的源路径设置为permitNumbers属性来加载permitNumbers,如下面的帖子中所建议的那样,但这也没有用。
答案 0 :(得分:0)
您需要进行一些更改。首先要做的是...... Window
所在的UserControl
或fareItemsControl ItemsControl
将对象设置为其DataContext
...我认为您刚刚设置了fareItemCollection
为DataContext
。那是你的第一个错误。
该集合属性属于某个类。将您的permitNumbers
集合作为属性移动到同一个类。现在将该类的实例(包含两个集合属性)设置为DataContext
。
现在,您需要更新ItemsControl.ItemsSource
媒体资源:
<ItemsControl Name="fareItemsControl" ItemsSource="{Binding fareItemCollection}" ... />
对于最后一部分,@ethicallogics指出您需要使用RelativeSource Binding
从permitNumbers
内部访问DataTemplate
集合,这是正确的。但是,他省略了必要的DataContext
部分。所以正确的RelativeSource Path
应该是更像这样的东西:
<ComboBox ItemsSource="{Binding DataContext.permitNumbers, RelativeSource={
RelativeSource AncestorType={x:Type Window}}}" IsEditable="True"></ComboBox>
这意味着ComboBox.ItemsSource
正在对象中查找名为permitNumbers
的属性,该属性设置为父DataContext
的{{1}}。这应该可以解决问题。