【问题标题】:DatagridColumn CheckBox Bound Checked property not WorkingDatagridColumn CheckBox Bound Checked 属性不起作用
【发布时间】:2014-05-09 15:42:23
【问题描述】:

我有一个将列绑定到列表(AnonymousType)的 Datagrid,一个是使用 DataGridTemplateColumn.CellTemplate 的 CheckBox,这是 XAML:

<DataGrid Name="dgServicios" Margin="15" AutoGenerateColumns="False" 
                                  AlternatingRowBackground="#CCEEF6"  
                                  SelectionMode="Single" SelectionUnit="Cell" TabIndex="20" >
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Selected" Width="Auto">                            
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Selected,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" 
                                          HorizontalAlignment="Center" Click="CheckBox_Click"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Codigo" Binding="{Binding Codigo}" Width="Auto" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Nombre" Binding="{Binding Nombre}" Width="Auto" IsReadOnly="True"/>
                </DataGrid.Columns>
            </DataGrid>

CheckBox 在运行时工作正常,但是当我尝试从 DB 恢复值时 IsChecked 属性不会持续存在,items 布尔属性是好的,但没有检查任何绑定复选框。如何获得与项目布尔属性匹配的复选框?绑定错误?

【问题讨论】:

  • 我们需要看看你的 ViewModel 是如何工作的。为了使值更改传播到视图,该属性必须引发更改通知。不知道是不是这个问题。

标签: c# wpf checkbox


【解决方案1】:

您能否提供有关您要绑定的对象列表的更多信息?

据我所知,您的绑定似乎编码正确。我尝试将您的 xaml 复制并粘贴到一个新的解决方案中,然后将 ItemsSource 属性设置为我创建的具有相同列名的类,并且一切似乎都正常工作。我绑定到的“GridItem”的 ObservableCollection 实现了 INotifyPropertyChanged 接口,并且只要属性得到更新,它就会通知 UI。这是我为测试您的 xaml 所做的:

MainWindow.xaml.cs 背后的代码:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<GridItem> GridItems;    

        public MainWindow()
        {
            InitializeComponent();

            GridItems = new ObservableCollection<GridItem>();

            GridItems.Add(new GridItem { Codigo = "value1", Nombre = "Value2", Selected = false });
            GridItems.Add(new GridItem { Codigo = "value3", Nombre = "Value4", Selected = true });
            GridItems.Add(new GridItem { Codigo = "value5", Nombre = "Value6", Selected = false });

            dgServicios.ItemsSource = GridItems;
        }

        private void CheckBox_Click(object sender, RoutedEventArgs e)
        {

        }
    }


    public class GridItem : INotifyPropertyChanged
    {
        private bool _Selected;

        public bool Selected
        {
            get { return _Selected; }
            set 
            { 
                _Selected = value;
                OnPropertyChanged();
            }
        }


        private string _Codigo;

        public string Codigo
        {
            get { return _Codigo; }
            set
            {
                _Codigo = value;
                OnPropertyChanged();
            }
        }
        private string _Nombre;

        public string Nombre
        {
            get { return _Nombre; }
            set
            {
                _Nombre = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

}

如果你提供更具体的信息,我可能会给你一个更好的答案。

【讨论】:

  • 谢谢您的回答...我发现我弄错了绑定路径,正确的属性是“Seleccionado”(西班牙语),我写了 Selected(n 英语:P)...谢谢方式:)
  • 啊,不错。这实际上将是我下一个关于拼写和绑定名称的问题。仅供参考,以后您可以转到 Visual Studio 中的“项目输出”窗口,查看是否有任何有关绑定错误的警告,因为默认情况下,它们不会导致任何编译错误。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2011-01-07
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多