根据 ObservableCollection<T> 项目的 WPF select 组合框项目
WPF select combox item according to ObservableCollection<T> item
我不知道怎么问这个问题,但我会尽力的。
我有绑定到 GridView 的 ObservableCollection,并且 GridView 有一个带有组合框的列,我需要在用来自 ObservableCollection 的数据填充 gridview 时自动 select 来自组合框的项目。
XAML
<DataGrid x:Name="dg" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date"></DataGridTextColumn>
<DataGridTextColumn Header="Description"></DataGridTextColumn>
<DataGridTemplateColumn Header="Status" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="cb" SelectedItem="{Binding Path=Status}" SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public ObservableCollection<Record> TasksList = new ObservableCollection<Record>();
public string DbDoc;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private void AddRecord(Record task)
{
TasksList.Add(task);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DbDoc = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "records.xml");
if (File.Exists(DbDoc))
{
using (StreamReader reader = new StreamReader(DbDoc))
{
XmlSerializer serializer = new XmlSerializer(typeof(Records));
Records records = (Records)serializer.Deserialize(reader);
records.RecordsList.ForEach(a=>TasksList.Add(a));
dg.ItemsSource = TasksList;
}
}
}
}
[XmlRoot("Records")]
public class Records
{
[XmlElement("Record", typeof(Record))]
public List<Record> RecordsList { get; set; }
}
public class Record
{
[XmlElement("Date")]
public string Date { get; set; }
[XmlElement("Description")]
public string Description { get; set; }
[XmlElement("Status")]
public string Status { get; set; }
}
public class EnumBindingSourceExtention : MarkupExtension
{
public Type EnumType { get; private set; }
public EnumBindingSourceExtention(Type enumType)
{
if (enumType == null || !enumType.IsEnum)
{
throw new Exception("EnumType is null or not EnumType");
}
this.EnumType = enumType;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(EnumType);
}
}
public enum status
{
New,
Old
}
所以,我需要在 window 中加载,同时将 TasksList
绑定到数据网格 dg
以获取 Status
字符串和 select 项目来自组合框。
有什么帮助吗?
将 Record
class 的 Status
属性 的类型更改为 status
(枚举类型)或设置 ItemsSource
属性 的 ComboBox
到 IEnumerable<string>
:
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(EnumType).Cast<object>().Select(x => x.ToString());
}
类型必须匹配。您不能将 string
属性 设置为枚举 (enum) 值。
我不知道怎么问这个问题,但我会尽力的。 我有绑定到 GridView 的 ObservableCollection,并且 GridView 有一个带有组合框的列,我需要在用来自 ObservableCollection 的数据填充 gridview 时自动 select 来自组合框的项目。
XAML
<DataGrid x:Name="dg" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date"></DataGridTextColumn>
<DataGridTextColumn Header="Description"></DataGridTextColumn>
<DataGridTemplateColumn Header="Status" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="cb" SelectedItem="{Binding Path=Status}" SelectionChanged="cb_SelectionChanged" ItemsSource="{Binding Source={local:EnumBindingSourceExtention {x:Type local:status}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public ObservableCollection<Record> TasksList = new ObservableCollection<Record>();
public string DbDoc;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private void AddRecord(Record task)
{
TasksList.Add(task);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DbDoc = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "records.xml");
if (File.Exists(DbDoc))
{
using (StreamReader reader = new StreamReader(DbDoc))
{
XmlSerializer serializer = new XmlSerializer(typeof(Records));
Records records = (Records)serializer.Deserialize(reader);
records.RecordsList.ForEach(a=>TasksList.Add(a));
dg.ItemsSource = TasksList;
}
}
}
}
[XmlRoot("Records")]
public class Records
{
[XmlElement("Record", typeof(Record))]
public List<Record> RecordsList { get; set; }
}
public class Record
{
[XmlElement("Date")]
public string Date { get; set; }
[XmlElement("Description")]
public string Description { get; set; }
[XmlElement("Status")]
public string Status { get; set; }
}
public class EnumBindingSourceExtention : MarkupExtension
{
public Type EnumType { get; private set; }
public EnumBindingSourceExtention(Type enumType)
{
if (enumType == null || !enumType.IsEnum)
{
throw new Exception("EnumType is null or not EnumType");
}
this.EnumType = enumType;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(EnumType);
}
}
public enum status
{
New,
Old
}
所以,我需要在 window 中加载,同时将 TasksList
绑定到数据网格 dg
以获取 Status
字符串和 select 项目来自组合框。
有什么帮助吗?
将 Record
class 的 Status
属性 的类型更改为 status
(枚举类型)或设置 ItemsSource
属性 的 ComboBox
到 IEnumerable<string>
:
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Enum.GetValues(EnumType).Cast<object>().Select(x => x.ToString());
}
类型必须匹配。您不能将 string
属性 设置为枚举 (enum) 值。