如何将DataGrid列绑定到组合框

如何解决如何将DataGrid列绑定到组合框

我正在尝试设置以下播放器集合,但无法显示/更新数据集合。 我有2个班级:CountryModel和PlayerModel CountryModel类的定义如下:

public static class CountryModel
    {
        public class Country
        {
            public string Name { get; set; }
            public string Abbr { get; set; }
            public byte[] Flag { get; set; }
        }

        public static async Task<ObservableCollection<Country>> GetCountriesAsync()
        {
            // Get all country names from system
            var ThreeLetterMapping = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                                        .Select(ci => new RegionInfo(ci.LCID))
                                        .GroupBy(ri => ri.EnglishName)
                                        .ToDictionary(g => g.Key,g => g.First().ThreeLetterISORegionName);
            // Create observablecollection to contain list of country names
            ObservableCollection<Country> getNames = new ObservableCollection<Country>();
            // Run task of getting every country files
            await Task.Run(() =>
            {
                // Get all files from Resources directory
                string[] Files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + @"\Resources\");
                foreach (string Name in Files)
                {
                    // Add only country name without extension if png format
                    if (Path.GetExtension(Name) == ".png" && !Name.Contains("BCA"))
                    {

                        byte[] image = System.IO.File.ReadAllBytes(Name);


                        // Country name without extension
                        string CountryName = Path.GetFileNameWithoutExtension(Name);
                        // Get abbreviation from above ThreeLetterMapping variable
                        string abbr = null;
                        try
                        {
                            // Country exists and mapping is possible
                            abbr = ThreeLetterMapping[CountryName];
                        }
                        catch
                        {
                            // Custom mapping to 3 letter using first 3 letters in country name
                            abbr = CountryName.Substring(0,3);
                        }
                        // Add country with data to list
                        getNames.Add(new Country { Name = CountryName,Abbr = abbr,Flag = image });
                        //getNames.Add(new Country { Name = CountryName,Flag = GetFlag(CountryName) });
                    }
                }
            });
            return getNames;
        }

        public static BitmapImage GetFlag(string CountryName)
        {
            try
            {
                BitmapImage getFlag = new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory + @"\Resources\" + CountryName + ".png"));
                //BitmapImage getFlag = new BitmapImage(new Uri("pack://application:,/Resources/" + CountryName + ".png"));
                return getFlag;
            }
            catch (Exception e)
            {
                MessageBox.Show("Error: " + e.Message,"Retrieve Flag",MessageBoxButton.OK,MessageBoxImage.Error);
                return null;
            }
        }

从上面的代码中可以看到,我可以从上述类中成功检索到List<CountryModel>

现在我的MainWindow看起来像这样:

enter image description here

文本框的定义如下:

<TextBox x:Name="TextBoxId" Grid.Column="1" Grid.Row="0" Text="{Binding SelectedItem.Id,ElementName=DataGridPlayers}" IsEnabled="False" Height="26" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="0,12,0" IsTabStop="False"/>
<TextBox x:Name="TextBoxFullName" Grid.Column="1" Grid.Row="1" Text="{Binding SelectedItem.FullName,0" IsTabStop="False"/>
<TextBox x:Name="TextBoxLastName" Grid.Column="1" Grid.Row="2" Text="{Binding SelectedItem.LastName,ElementName=DataGridPlayers}" Height="26" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="0,0" TabIndex="1"/>
<TextBox x:Name="TextBoxFirstName" Grid.Column="1" Grid.Row="3" Text="{Binding SelectedItem.FirstName,0" TabIndex="2"/>
<TextBox x:Name="TextBoxMiddleName" Grid.Column="1" Grid.Row="4" Text="{Binding SelectedItem.MiddleName,0" TabIndex="3"/>
<ComboBox x:Name="ComboBoxGender" Grid.Column="1" Grid.Row="5" SelectedIndex="{Binding SelectedItem.Male,ElementName=DataGridPlayers}" Height="26" HorizontalAlignment="Left" Width="100" TabIndex="4">
     <ComboBoxItem Content="Female"/>
     <ComboBoxItem Content="Male"/>
</ComboBox>
<ComboBox x:Name="ComboBoxCountry" Grid.Column="1" Grid.Row="6" SelectedValuePath="Name" SelectedValue="{Binding SelectedItem.Country,ElementName=DataGridPlayers}" IsTextSearchEnabled="True" TextSearch.TextPath="Name" Height="26" HorizontalAlignment="Stretch" Margin="0,0" TabIndex="5">
     <ComboBox.ItemTemplate>
          <DataTemplate>
               <StackPanel Orientation="Horizontal">
                    <Image Width="30" Source="{Binding Flag}"/>
                    <TextBlock Text="{Binding Name}" Margin="4,0"/>
               </StackPanel>
          </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

DataGrid的定义如下:

<DataGrid Grid.Column="1" x:Name="DataGridPlayers" AutoGenerateColumns="False" IsReadOnly="True" CanUserSortColumns="True" CanUserAddRows="False" AlternatingRowBackground="LightGray" SelectionChanged="DataGridPlayers_SelectionChanged" TabIndex="12">
     <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Id}" Visibility="Hidden"/>
          <DataGridTextColumn Binding="{Binding LastName}" Visibility="Hidden"/>
          <DataGridTextColumn Binding="{Binding FirstName}" Visibility="Hidden"/>
          <DataGridTextColumn Binding="{Binding MiddleName}" Visibility="Hidden"/>
          <DataGridTextColumn Header="Player full name" Binding="{Binding FullName}" Width="1.5*"/>
          <DataGridTextColumn Binding="{Binding Male}" Visibility="Hidden"/>
          <DataGridTextColumn Header="Country" Binding="{Binding Country}" Width="*"/>
          <DataGridTemplateColumn Header="Flag" Width="40" IsReadOnly="True">
               <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                         <Image Source="{Binding Flag}"/>
                    </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
     </DataGrid.Columns>
     <DataGrid.RowStyle>
          <Style TargetType="DataGridRow">
               <Style.Triggers>
                    <DataTrigger Binding="{Binding Flag}" Value="{x:Null}">
                         <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger>
               </Style.Triggers>
          </Style>
     </DataGrid.RowStyle>
</DataGrid>

这是我后面的代码:

public partial class MainWindow : Window
    {
        private ObservableCollection<CountryModel.Country> ListCountries;
        private ObservableCollection<PlayerModel> ListPlayers;
        public MainWindow()
        {
            InitializeComponent();
            GetCountriesAsync();
            ListPlayers = new ObservableCollection<PlayerModel>();
            DataGridPlayers.ItemsSource = ListPlayers;
        }

        private async void GetCountriesAsync()
        {
            ListCountries = await Task.Run(() => CountryModel.GetCountriesAsync());
            ComboBoxCountry.ItemsSource = ListCountries;
        }

        private void ButtonAddPlayer_Click(object sender,RoutedEventArgs e)
        {
            PlayerModel newplayer = new PlayerModel { LastName = "Lastname",FirstName = "Firstname",MiddleName = "Middlename",Male = true,Country = "" }; //,Flag = null
            ListPlayers.Add(newplayer);
            DataGridPlayers.SelectedItem = ListPlayers.Last();
        }
    }

现在我对此有几个问题: 如何将“国旗”列绑定到国家的国旗图像? 为什么当我更新左侧的字段(例如姓氏或国家/地区)时,数据网格未相应更新?

感谢您抽出宝贵的时间来帮助您! 绝地大师

解决方法

第二个问题: 如果您没有安装Fody,则您的班级应该看起来像这样

我建议您看一下。正如您在示例中看到的那样,大量清理了代码。 https://github.com/Fody/PropertyChanged

否则,WPF不知道DataGrid中的属性是通过左侧的框进行更改的。您需要将其通知WPF。

    public class Country : INotifyPropertyChanged
    {
        private string name;

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                OnPropertyChanged(nameof(Name));
            }
        }

        private string abbr;

        public string Abbr
        {
            get { return abbr; }
            set
            {
                abbr = value;
                OnPropertyChanged(nameof(Abbr));
            }
        }

        private string countryName;

        public string CountryName
        {
            get { return countryName; }
            set
            {
                countryName = value;
                OnPropertyChanged(nameof(CountryName));
                OnPropertyChanged(nameof(Flag));
            }
        }

        public BitmapImage Flag => GetFlag(countryName);

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

身体示例:

    public class Country : INotifyPropertyChanged
    {       
        public string Name { get; set; }

        public string Abbr { get; set; }

        public string CountryName { get; set; }

        public BitmapImage Flag => GetFlag(CountryName);

        public event PropertyChangedEventHandler PropertyChanged;
    }

第一个问题:以类设置为例,然后可以将ImageSource绑定到Flag。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res