【问题标题】:Updating ComboBox in XAML without Somegrid.Items.Refresh()在没有 Somegrid.Items.Refresh() 的情况下更新 XAML 中的 ComboBox
【发布时间】:2017-05-23 11:42:11
【问题描述】:

我是 WPF+C# 的新手,开始掌握它。

我想在程序运行时更新 DataGrid 中的 ComboBox。 不幸的是,如果我使用 Somegrid.Item.Refresh() 来更新 DataGrid,ComboBox 永远不会显示任何选定的项目。


这里是 XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid Name="Somegrid" HorizontalAlignment="Left" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False">
            <DataGrid.Columns>

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.Header>
                        <TextBlock Text="SomebodY" />
                    </DataGridTemplateColumn.Header>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Somebody}" SelectionChanged="ComboBox_SelectionChanged_Somebody" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.Header>
                        <TextBlock Text="SomethinG" />
                    </DataGridTemplateColumn.Header>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Something}" SelectionChanged="ComboBox_SelectionChanged_Something" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.Header>
                        <TextBlock Text="SomewherE" />
                    </DataGridTemplateColumn.Header>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Somewhere}" SelectionChanged="ComboBox_SelectionChanged_Somewhere" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

隐藏代码

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();

            someclassFoo.Somebody = new List<string>() { "Alan", "Benjamin" };

            observableSomeclassFoo.Add(someclassFoo);
            Somegrid.ItemsSource = observableSomeclassFoo;

        }


        public SomeclassFoo someclassFoo = new SomeclassFoo();
        private ObservableCollection<SomeclassFoo> _observableSomeclassFoo = new ObservableCollection<SomeclassFoo>();
        public ObservableCollection<SomeclassFoo> observableSomeclassFoo { get { return _observableSomeclassFoo; } }


        private void ComboBox_SelectionChanged_Somebody(object sender, RoutedEventArgs e)
        {
            System.Windows.Controls.ComboBox cb1 = (System.Windows.Controls.ComboBox)sender;

            if (cb1.SelectedItem.ToString() == "Alan")
            {
                someclassFoo.Something = new List<string>() { "Apple" };
            }
            else if (cb1.SelectedItem.ToString() == "Benjamin")
            {
                someclassFoo.Something = new List<string>() { "Banana" };
            }

            //Somegrid.Items.Refresh();
        }


        private void ComboBox_SelectionChanged_Something(object sender, RoutedEventArgs e)
        {
            System.Windows.Controls.ComboBox cb2 = (System.Windows.Controls.ComboBox)sender;

            if (cb2.SelectedItem.ToString() == "Apple")
            {
                someclassFoo.Somewhere = new List<string>() { "Antartica" };
            }
            else if (cb2.SelectedItem.ToString() == "Banana")
            {
                someclassFoo.Somewhere = new List<string>() { "Bedrock" };
            }

            //Somegrid.Items.Refresh();
        }


        private void ComboBox_SelectionChanged_Somewhere(object sender, RoutedEventArgs e)
        {
            System.Windows.Controls.ComboBox cb3 = (System.Windows.Controls.ComboBox)sender;

            MessageBox.Show(cb3.SelectedItem.ToString().ToUpper() + " selected");
        }


    }
}

另一个类

using System.Collections.Generic;

namespace WpfApplication1
{
    public class SomeclassFoo
    {
        public IList<string> Somebody { get; set; }

        public IList<string> Something { get; set; }

        public IList<string> Somewhere { get; set; }
    }
}

如何在不使用 Somegrid.Item.Refresh() 的情况下更新 ComboBox SomethinG 和 ComboBox SomewherE

【问题讨论】:

    标签: c# wpf xaml combobox datagrid


    【解决方案1】:

    不是刷新网格,而是移除当前源并设置一个新源:

    yourGrid.ItemsSource = null;

    yourGrid.ItemsSource = yourDataSource;

    【讨论】:

      【解决方案2】:

      SomeclassFoo 类型应实现INotifyPropertyChanged 接口并引发更改通知:

      public class SomeclassFoo : INotifyPropertyChanged
      {
          private IList<string> _somebody;
          public IList<string> Somebody
          {
              get { return _somebody; }
              set { _somebody = value; NotifyPropertyChanged(); }
          }
      
          private IList<string> _something;
          public IList<string> Something
          {
              get { return _something; }
              set { _something = value; NotifyPropertyChanged(); }
          }
      
          private IList<string> _someWhere;
          public IList<string> Somewhere
          {
              get { return _someWhere; }
              set { _someWhere = value; NotifyPropertyChanged(); }
          }
      
          public event PropertyChangedEventHandler PropertyChanged;
          private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
          {
              if (PropertyChanged != null)
                  PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
      

      如何:实现属性更改通知: https://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多