我花了一整天的时间来搜索帮助,并且在这个问题上没有找到太大的成功。我试图将枚举绑定到datagrid中的comboboxColumn,并取得了很大的成功。我现在唯一的问题是,在启动或使用Items.Refresh()
的应用程序时,所有ComboBox列都是空的。新添加的行还具有空的Commobox字段。
组合蛋白当前按预期运行并可以设置值,但是在启动时,字段仍然是空的。当然,这不是理想的行为。到目前为止,我要试图解决问题的最佳结果是只有新的行列显示一个默认字段(在这种情况下,"无"(,这也不需要。我不记得如何复制。
我不知道该问题是否特定于枚举,但它用于组合,因此我将其考虑为相关。
示例代码
XAML
<DataGrid x:Name="ProfileData"
ItemsSource="{Binding Player}"
Margin="0,150,0,0"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Name"
Binding="{Binding Name}"
Header="Name"
Width="150"/>
<DataGridComboBoxColumn Header="Race"
x:Name="RaceComboBox"
SelectedValueBinding="{x:Null}"
SelectedItemBinding="{Binding Race}"
TextBinding="{x:Null}"
Width="150">
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
//
// Extra stuff to display ProfileData content, not necessary for reproduction
//
<TextBlock x:Name="DBText" HorizontalAlignment="Left" Margin="0,25,0,0" Padding="10,10"
TextWrapping="Wrap" Text="Information about the list"
VerticalAlignment="Top" FontSize="18"/>
<Button x:Name="DisplayDBContentButton" Content="Display DB content"
HorizontalAlignment="Left" Margin="10,125,0,0" VerticalAlignment="Top"
Width="120" Click="DisplayDBContentButton_Click"/>
<Button x:Name="Refresh" Content="Items.Refresh()" HorizontalAlignment="Left"
Margin="151,125,0,0" VerticalAlignment="Top" Width="120"
Click="Refresh_Click"/>
c#
public partial class MainWindow : Window
{
ObservableCollection<Player> PlayerCollection { get; set; } // List of Players
ObservableCollection<string> RaceCollection { get; set; } // Races as a string
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PlayerCollection = new ObservableCollection<Player>()
{
new Player() {Name = "Samuel", Race = Race.Human },
new Player() {Name = "Scoof", Race = Race.Orc },
new Player() {Name = "Sel", Race = Race.Elf }
};
RaceCollection = new ObservableCollection<string>();
string[] raceList = Enum.GetNames(typeof(Race));
foreach (string s in raceList)
RaceCollection.Add(s);
RaceComboBox.ItemsSource = RaceCollection;
ProfileData.ItemsSource = PlayerCollection;
}
//
// Extra code to display PlayerCollection content, not necessary for reproduction
//
private void DisplayDBContentButton_Click(object sender, RoutedEventArgs e)
{
var displayString = "";
foreach (Player p in PlayerCollection)
displayString += String.Format("Name: {0} Race: {1}n", p.Name, p.Race);
DBText.Text = displayString;
}
private void Refresh_Click(object sender, RoutedEventArgs e)
{
ProfileData.Items.Refresh();
}
}
//
// Required code again
//
public class Player
{
public string Name { get; set; } = "Default Name";
public Race Race { get; set; } = Race.None;
}
public enum Race
{
None,
Human,
Orc,
Elf
}
链接到启动和显示文本
的应用程序图片当然,我错过了可能很明显的东西,或者是无意中搞砸了其他东西的东西,因此对任何帮助都表示赞赏。
您需要在您的应用程序中设置DataGridComboBoxColumn
的ItemSource
,那应该是RaceCollection
。
但是RaceCollection
中有一些问题:
1. RaceCollection
中的项目是字符串,但是SelectedItemBinding
与Race
类型结合。WPF不知道如何在string
和Race
之间施放。因此RaceCollection
应为ObservableCollection<Race>
。
2. RaceCollection
均由Race
的所有可用值填充,因此可以是静态的。
结果:
XAML
<DataGrid
x:Name="ProfileData"
ItemsSource="{Binding PlayerCollection}"
Margin="0,150,0,0"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn
x:Name="Name"
Binding="{Binding Name}"
Header="Name"
Width="150" />
<DataGridComboBoxColumn
Header="Race"
x:Name="RaceComboBox"
ItemsSource="{x:Static local:Window2.RaceCollection}"
SelectedItemBinding="{Binding Race}"
Width="150">
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
代码
public partial class Window2 : Window
{
public ObservableCollection<Player> PlayerCollection { get; set; } = new ObservableCollection<Player>();
public static ObservableCollection<Race> RaceCollection { get; set; } = new ObservableCollection<Race>();
static Window2()
{
var raceList = Enum.GetValues(typeof(Race)).Cast<Race>();
foreach (var race in raceList)
{
RaceCollection.Add(race);
}
}
public Window2()
{
InitializeComponent();
DataContext = this;
Loaded += (s, e) =>
{
PlayerCollection.Add(new Player() { Name = "Samuel", Race = Race.Human });
PlayerCollection.Add(new Player() { Name = "Scoof", Race = Race.Orc });
PlayerCollection.Add(new Player() { Name = "Sel", Race = Race.Elf });
};
}
}
它在我的机器中运行良好。
屏幕截图