【问题标题】:wpf datagrid: write value in textbox columnwpf datagrid:在文本框列中写入值
【发布时间】:2013-10-14 06:19:28
【问题描述】:

我有一个带有一些列的 Datagrid。它绑定到对象列表。 其中一列是文本列:我需要它作为“验证”列,事实上我希望,对于每一行,这个单元格的值是“OK”或“NOT OK”,基于其他单元格中存在的值.我不知道如何将字符串写入 Datagrid 中的某个单元格。 有什么建议吗?

编辑: 跟在描述 DataGrid 对象的类之后

public class BracketProperty
{
    [XmlAttribute]
    public int index { get; set; }
    public BracketType type { get; set;}
    public List<BracketPoint> bracketPointsList;
    [XmlIgnore]
    public String isPointSelectionEnded { get; set; }
}

编辑2: 有人说这行代码不好

this.BracketsDataGrid.ItemsSource = this.currentPropertyToShow.sides[this.sideIndex - 1].brackets;

brackets 定义为

 public ObservableCollection<BracketProperty> brackets;

因为不是绑定...如何将其更改为绑定?

【问题讨论】:

    标签: wpf datagrid datagridtextcolumn


    【解决方案1】:

    最简单的方法是为DataGrid 中的每一列创建一个具有public 属性的数据类型类。你应该在这个类中实现INotifyPropertyChanged 接口。

    然后您可以拥有一个可以在 PropertyChanged 处理程序中更新的属性:

    private void YourDataType_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (Property1 == "SomeValue" && Property2 > 0) ValidationProperty = "OK";
        else ValidationProperty = "NOT OK"; // Add your own condition above of course
    }
    

    在构造函数中:

    PropertyChanged += YourDataType_PropertyChanged;
    

    【讨论】:

    • 我已经为 DataGrid 的每一列提供了一个具有公共属性的数据类型类(我在上面的问题中添加了它)。问题是,如果我在该类中实现 INotifyPropertyChanged,它会在启动时引发异常,因为字段 isPointSelectionEnded 上的循环。如何以正确的方式实现接口?请注意,我在不同的班级之间进行工作。
    • 在我的回答中,我为您提供了指向 MSDN 上 INotifyPropertyChanged 页面的链接(第 2 行)...单击它并按照该页面上的帮助进行操作。
    • 如果我实现 INotifyPropertyChanged,并在 setter 中将值更改为“Not ok”,值会更改但网格不会自动更新...我看到旧值...是吗物品的刷新好做吗?我问它是因为它随机引发了一个异常,例如“在 AddNew 或 EditItem 事务期间不允许刷新”
    • 当您正确实现INotifyPropertyChanged 接口时,您的public 属性应在设置后调用INotifyPropertyChanged.PropertyChanged 事件。这将在 UI 中“刷新”该字段。因此使用public 属性设置值以确保事件被调用。
    • 我已经完成了,但是 UI 没有刷新值...有人告诉我这可能是绑定问题...我更新了有关它的问题中的代码
    【解决方案2】:

    使用价值转换器

    public partial class MainWindow : Window
    {
        public ObservableCollection<Employee> EmpList { get; set; }
        public MainWindow()
        {
    
            InitializeComponent();
            this.DataContext = this;
            EmpList = new ObservableCollection<Employee> { 
                new Employee(1, "a"), 
                new Employee(2, "b"), 
                new Employee(3, "c") };
        }
    }
    
    public class NumValueConverter : IValueConverter
    {
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int v = int.Parse(value.ToString());
            if (v < 3) 
                return "YES";
            else 
                return "NO";
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
    public class Employee
    {
        public int Salary { get; set; }
        public string Name { get; set; }
    
        public Employee(int s, string n)
        {
            Salary = s;
            Name = n;
        }
    }
    

    XAML

    <Window x:Class="garbagestack.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:cv="clr-namespace:garbagestack"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.Resources>
                <cv:NumValueConverter x:Key="cv1"/>
            </Grid.Resources>
            <DataGrid AutoGenerateColumns="False" Margin="12,99,12,12" Name="dg1" ItemsSource="{Binding EmpList}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="NewValue" Binding="{Binding Salary}"/>
                    <DataGridTextColumn Header="NewValue" Binding="{Binding Name}"/>
                    <DataGridTextColumn Header="NewValue" Binding="{Binding Salary,Converter={StaticResource cv1}}">
    
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    【讨论】:

    • 问题基于其他列中的值
    【解决方案3】:

    我需要自己回答问题。我还没有实现任何 INotifyPropertyChanged 接口或转换器...唯一添加的代码,在设置控制变量的值后,如下:

     this.DataGrid.Items.Refresh();
    

    并且文本在网格中正确显示...

    但是,最好按照 MVVM 模式规则实现 INotifyPropertyChanged。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多