C# 如何将ItemsSource分配给ItemTemplate中的ComboBox?
以下是我当前的代码,简化为相关代码:C# 如何将ItemsSource分配给ItemTemplate中的ComboBox?,c#,wpf,combobox,listbox,datatemplate,C#,Wpf,Combobox,Listbox,Datatemplate,以下是我当前的代码,简化为相关代码: <telerik:RadListBox Grid.Row="0" Grid.Column="2" Margin="0, 5, 5, 5" x:Name="listBoxIssue" HorizontalAlignment="Left" VerticalAlignment="Top" Height="690" Width="793" ItemTemplate="{StaticReso
<telerik:RadListBox Grid.Row="0" Grid.Column="2" Margin="0, 5, 5, 5"
x:Name="listBoxIssue" HorizontalAlignment="Left" VerticalAlignment="Top"
Height="690" Width="793"
ItemTemplate="{StaticResource lbIssueTemplate}" ItemsSource="{Binding}">
我希望在这个场景中也能实现上面的代码。这里的困难在于我无法获取列的名称,也无法使用.Columns,因为它们是DataTemplate
注意:我没有使用MVVM。试试这个
xaml
Equipm class I仅使用了PrintCode属性
视图模型
公共类视图模型
{
公共视图模型()
{
选项=新的可观察集合{“全部”、“左”、“右”、“无”};
设备=新的可观察集合(){new equipm(),new equipm()};
}
公共可观测采集设备{get;set;}
公共ObservableCollection选项{get;set;}
}
查看是否存在任何绑定错误?还要确保RadListBox的ItemsSource是集合的集合。@pushpraj没有错误。与其说绑定有问题,不如说我不知道如何访问要绑定的相关控件。其他一切都很好-我在RadListBox中有复选框、文本框等。只是ComboBox更复杂,因为它需要两个不同的绑定—SelectedValuePath和ItemsSource。再次重申,我在GridView中完成了这一点,但在这里没有,因为我在访问所需的控件时遇到了困难。为了帮助理解,我将给出一个例子:“equipment”是绑定到ListBox的对象,其属性是Name(ABC)、Serial(123)、Quantity(5)和PrintCode(All)。这些很容易装订。但是对于PrintCode,我希望组合框被绑定以提供选项,这些选项是“None”、“Left”、“Right”和“All”。绑定后,所选值将自动为“全部”(根据上述装备对象)。在下拉组合框时,它应该有“无”、“左”ETC。要做到这一点,它需要绑定到另一个对象(PrintCode),而不是列表框的对象(Equip)。好了,现在我知道了问题所在,我更新了答案。谢谢你的帮助!就我所知,我不能像前面提到的那样实现MVVM。我只能在第二天进行实验,因为现在已经下班了,但现在我觉得如果不实现MVVM,就会缺少一些东西。这就是为什么如果代码在某一行中,比如>GridViewComboBoxColumn)gridPrintOption.Columns[“PrintCode”]).ItemsSource=listPrintCode,我会感到最舒服的原因。如果组合框位于GridView中,这种情况非常简单。
<DataTemplate x:Key="lbIssueTemplate">
<Grid Margin="0" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ComboBox x:Name="PrintCode" Grid.Row="0" Grid.Column="2" ItemsSource="{Binding}"
SelectedValuePath="PrintCode" DisplayMemberPath="PrintCode" />
</Grid>
</DataTemplate>
((GridViewComboBoxColumn)gridPrintOption.Columns["PrintCode"]).ItemsSource = listPrintCode;
<Window.Resources>
<DataTemplate x:Key="lbIssueTemplate">
<Grid Margin="0" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ComboBox x:Name="PrintCode" Grid.Row="0" Grid.Column="2"
SelectedValue="{Binding DataContext.PrintCode, RelativeSource={RelativeSource Mode=Self}, Mode=TwoWay}"
ItemsSource="{Binding DataContext.Choices, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
</Grid>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ListBox Background="Red" ItemTemplate="{StaticResource lbIssueTemplate}" ItemsSource="{Binding Equips}"></ListBox>
</StackPanel>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class Equip:INotifyPropertyChanged
{
public Equip()
{
PrintCode = "All";
}
private string printcode;
public string PrintCode
{
get { return printcode; }
set { printcode = value; OnPropertychanged("PrintCode"); }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertychanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
public class ViewModel
{
public ViewModel()
{
Choices = new ObservableCollection<string> { "All", "Left", "Right", "None" };
Equips = new ObservableCollection<Equip>() { new Equip(), new Equip() };
}
public ObservableCollection<Equip> Equips { get; set; }
public ObservableCollection<string> Choices { get; set; }
}