datagrid comboxColumn用于枚举的启动和items.refresh



我花了一整天的时间来搜索帮助,并且在这个问题上没有找到太大的成功。我试图将枚举绑定到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
}

链接到启动和显示文本

的应用程序图片

当然,我错过了可能很明显的东西,或者是无意中搞砸了其他东西的东西,因此对任何帮助都表示赞赏。

您需要在您的应用程序中设置DataGridComboBoxColumnItemSource,那应该是RaceCollection
但是RaceCollection中有一些问题:
1. RaceCollection中的项目是字符串,但是SelectedItemBindingRace类型结合。WPF不知道如何在stringRace之间施放。因此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 });
        };
    }
}

它在我的机器中运行良好。
屏幕截图

最新更新