我有两个简单的Model类和一个ViewModel ...
public class GridItem
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ViewModel
{
public ViewModel()
{
GridItems = new ObservableCollection<GridItem>() {
new GridItem() { Name = "Jim", CompanyID = 1 } };
CompanyItems = new ObservableCollection<CompanyItem>() {
new CompanyItem() { ID = 1, Name = "Company 1" },
new …Run Code Online (Sandbox Code Playgroud) 我已经查看了各种 问题的答案,但没有设法在我试图解决的问题的答案中映射内容.我把它简化为下面的代码(代表我想要实现的结果),并且基本上希望能够在没有编辑行的情况下渲染Person.TitleId其对应Title.TitleText的并且具有下拉列表正确绑定,以便TitleText在下拉列表中显示s,并在更改时将关联的TitleId背面写回Person记录.
简而言之,我<DataGridComboBoxColumn>在实现这一目标时会采取什么措施?
App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var viewModel = new ViewModels.MainWindowViewModel();
var mainWindow = new MainWindow();
mainWindow.DataContext = viewModel;
mainWindow.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)
MainWindow.xaml
<Grid>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Contacts}">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Title" SelectedItemBinding="{Binding Person}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/>
<Setter Property="IsReadOnly" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/>
<Setter Property="DisplayMemberPath" …Run Code Online (Sandbox Code Playgroud) 我想让用户能够编辑WPF DataGrid中的一些数据(来自.net Framework 4.0)."仪器"列应允许用户从静态列表中选择可用的仪器或写入自由文本.我的DataGrid使用MVVM绑定到数据.我尝试了很多我在互联网上找到的解决方案,但没有一个能正常工作.这是我的代码:
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Instrument" MinWidth="140"
ItemsSource="{x:Static ViewModel.Instruments}" SelectedItemBinding="{Binding Path=SelectedInstrument}">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsEditable" Value="True"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
下拉列表正确显示.可以使用任何文本编辑该字段,但在为自由文本关闭下拉列表后,它会为SelectedInstrument设置null.它仅适用于所选项目.我试图更改为SelectedValueBinding,但它没有帮助.
如何正确实施这一要求?有人可以在这里发布工作样本吗?
附加:订单是ObservableCollection Order具有类似字符串Title,DateTime Ordered,string SelectedInstrument,Instruments是一个字符串[]的属性
解决方案:以下建议作为bathineni工作的解决方法:
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Instrument" MinWidth="140">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=SelectedInstrument, Mode=OneWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" Text="{Binding Path=SelectedInstrument}"
ItemsSource="{x:Static ViewModel.Instruments}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud) 这真让我抓狂.我有一个DataGrid,它有一个DataGridComboBoxColumn,我希望用户可以使用它来进行选择.这是我网格的基本轮廓.
<DataGrid ItemsSource="{Binding GoalList}" DockPanel.Dock="Bottom" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn ItemsSource="{Binding LifeAreaList}" Header="Life Area"/>
<DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
DataGrid绑定到Goal类型的对象集合.每个目标都有一个LifeArea类型的属性.每个LifeArea都具有LifeAreaId和Name属性.
数据上下文包含一个可观察的目标集合:目标列表和生命区域列表:LifeAreaList.我希望用户能够为目标选择不同的生活区域.生命区域的名称也需要是显示的值.
编辑
解决方案是必须将DataGridComboBoxColumn的ItemsSource设置为静态资源.另一种选择是通过代码设置ItemsSource.
最后我有:
<DataGridComboBoxColumn x:Name="_lifeAreaComboBoxColumn" SelectedItemBinding="{Binding LifeArea}" DisplayMemberPath="Name" Header="Life Area">
Run Code Online (Sandbox Code Playgroud)
在后面的代码我设置ItemsSource:
_lifeAreaComboBoxColumn.ItemsSource = LifeAreaDAL.GetLifeAreas();
Run Code Online (Sandbox Code Playgroud)
当我有机会将其转换为StaticResource时.
有时最简单的例子是最难找到的...
我有一个包含2列的数据网格.一列包含角色信息,另一列应包含一个包含可用用户列表的组合框.组合框中的数据与第一列中的数据无关.由于组合框没有datacontext,只有一个itemsource而且我似乎无法使用绑定这一事实让我感到震惊.
有人可以请一个简单的例子,它为表格和组合框中的数据使用两个不同的数据集吗?
我在XAML中创建了一个DataGrid,并将ItemsSource绑定到包含属性的某个类的ObservableCollection.然后在C#中,我创建了一个DataGridTextColumn和一个DataGridComboBoxColumn,并将这些绑定到ObservableCollection内对象的属性.我可以将DataGridComboBoxColumn绑定到一个简单的Collection,但我想要做的是将它绑定到一组字符串集合,这样对于每一行,DataGrid中的ComboBox都有一个不同的字符串集合.我没有这样做......
如何绑定DataGridCombBoxColumn以便我可以为此类型列的每一行设置不同的字符串集合?
XAML:
<Window>
<!-- ... -->
WPFToolkit:DataGrid
x:Name="DG_Operations"
Margin="10,5,10,5"
Height="100"
HorizontalAlignment="Stretch"
FontWeight="Normal"
ItemsSource="{Binding Path=OperationsStats}"
AlternatingRowBackground="{DynamicResource SpecialColor}"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
SelectionMode="Extended"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="True"
CanUserSortColumns="True"
AutoGenerateColumns="False"
IsReadOnly="False"
IsEnabled="True"
BorderThickness="1,1,1,1"
VerticalAlignment="Stretch"/>
<!-- ... -->
</Window>
Run Code Online (Sandbox Code Playgroud)
C#:
public class DataModelStatsOperations
{
public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}
public interface IStatsOperation
{
string Operation { get; set; }
Collection<string> Data{ get; set; }
}
public class StatsOperation : IStatsOperation
{
public StatsOperation(string operation, Collection<string> data)
{
Operation = operation; …Run Code Online (Sandbox Code Playgroud) 我有3个表:Item - 这是DataContext - 它有一个导航列Group Group - 有一个导航列Category.
我希望在DataGrid中包含(类别和组)列,当我选择一个类别时,它应该只在组列中显示Category.Groups.
这是我正在处理的代码:
<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
<tk:DataGrid.Columns>
<!--Works-->
<tk:DataGridComboBoxColumn
Header="Categroy"
DisplayMemberPath="Title"
SelectedValuePath="CategoryId"
SelectedValueBinding="{Binding Group.Category.CategoryId}"
ItemsSource="{Binding Context.Categories,
Source={x:Static Application.Current}}"
/>
<!--Look at these two things:-->
<!--This does work-->
<tk:DataGridTemplateColumn>
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl
ItemsSource="{Binding Group.Category.Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type data:Group}">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
</tk:DataGridTemplateColumn>
<!--But this does NOT work, even it's the same source-->
<!--Notice I even tried a dummy converter and doesnt reach there-->
<tk:DataGridComboBoxColumn
Header="Group"
DisplayMemberPath="Title"
SelectedValuePath="GroupId"
ItemsSource="{Binding Group.Category.Groups, …Run Code Online (Sandbox Code Playgroud) 问题:DataGridComboBox上的大多数代码示例似乎都使用静态资源作为ItemsSource.在我的用例中,我想为每个绑定对象提供不同的ItemsSources. 可以这样做吗?
背景:我正在尝试使用DataGridComboBoxColumn控件将一组Question类对象绑定到WPF DataGrid.Answer字符串提供SelectedValue.我希望AnswerDomain列表为每个ComboBox提供ItemsSource.AnswerDomain与Question到Question不同.
类
public class Question
{
string Answer {get; set;}
List<string> AnswerDomain {get; set;}
//...other stuff
}
Run Code Online (Sandbox Code Playgroud)
XAML
<DataGrid ItemsSource="{Binding Path=InspectionItems}" AutoGenerateColumns="False" Name="dataGrid1" >
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Answer Domain"
DisplayMemberPath="Answer"
SelectedValuePath="Answer"
ItemsSource="{Binding Path=AnswerDomain}"
>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
问题:有几个问题.现在的关键问题是每个DataGrid Row中的ComboBox都没有显示AnswerDomain字符串.我尝试过一系列XAML组合但没有成功.帮我Stack Overflow.
更新: 下面选择的解决方案有效.在进一步摸索之后,通过添加UpdateSourceTrigger=PropertyChanged到SelectedItem,组合框中的用户更改然后反映在底层自定义对象中.
<DataGridTemplateColumn Header="Answer">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
ItemsSource="{Binding AnswerDomain}"
SelectedItem="{Binding Answer, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud) 我在阅读该领域时遇到了麻烦.我尝试过不同的方式,但仍然不能.我想读取用户选择以下3个值的值.
XAML中的代码
<DataGridComboBoxColumn X:Name="dgcbc" Header="Wynik"/>
Run Code Online (Sandbox Code Playgroud)
C#中的代码
List<string> list = new List <string> ();
lista.Add ("Prize");
lista.Add ("Draw");
lista.Add ("Lost");
dgcbc.ItemsSource = list;
Run Code Online (Sandbox Code Playgroud) 这里提出类似于我的问题的问题,但我没有在那里找到解决方案.
我的问题:如何将不同数据(比如Lists)绑定到不同行中每个ComboBox的"DataGridComboBoxColumn".这是我试过的代码
XAML:
<Grid>
<DataGrid x:Name="dg_TimeTable" AutoGenerateColumns="False" Margin="0,0,0,97" ColumnWidth="*">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" Binding="{Binding CLASS}" Header="CLASS" />
<DataGridComboBoxColumn Header="PERIOD" x:Name="gPeriods" SelectedValueBinding="{Binding PERIOD, Mode=TwoWay}" DisplayMemberPath="{Binding PERIOD}" />
<DataGridComboBoxColumn Header="TEACHERS" x:Name="gTeachers" SelectedValueBinding="{Binding TEACHER, Mode=TwoWay}" DisplayMemberPath="{Binding TEACHER}" />
<DataGridComboBoxColumn Header="SUBJECTS" x:Name="gSubjects" SelectedValueBinding="{Binding SUBJECT, Mode=TwoWay}" DisplayMemberPath="{Binding SUBJECT}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
的.cs
using System.Collections.ObjectModel; // For ObservableCollection
public partial class MainWindow : Window
{
ObservableCollection<string> listTeachersSix = null;
ObservableCollection<string> listTeachersSeven = null;
ObservableCollection<string> listTeachersEight = null;
ObservableCollection<string> listTeachersNine = null;
ObservableCollection<string> listTeachersTen = null; …Run Code Online (Sandbox Code Playgroud) wpf ×10
datagrid ×5
c# ×4
binding ×3
.net ×2
mvvm ×2
wpfdatagrid ×2
itemssource ×1
wpftoolkit ×1