DataGrid设置属性,但不获取值来改变SelectedIndex

本文关键字:改变 SelectedIndex 获取 设置 属性 DataGrid | 更新日期: 2023-09-27 18:11:39

我在Datagrid中遇到了一个奇怪的问题。我使用WPF与数据绑定,我有一个数据网格,和3个按钮在一个页面-保存,更新,取消-和很多标签。这些标签,当用户单击更新按钮时,将启用这些标签的编辑模式。

在编辑模式下,该用户不能更改网格的SelectedIndex(这是我的问题)。我试图创建一个属性IsNotEditable,绑定到IsEnabled="的DataGrid,但如果它被禁用,当前行是未选择的。

我不能用那个,因为当用户点击保存时,我会保存选中的行。所以…我已经创建了另一个属性PlacasSelectedItem和一个"支持"属性PlacasSelectedAux,代码如下:

 public ConeSlab PlacasSelectedAux { get; set; }
    private ConeSlab placasSelectedItem;
    public ConeSlab PlacasSelectedItem
    {
        get { return placasSelectedItem; }
        set
        {
            if (CurrentEditMode == EditMode.View)
            {
                placasSelectedItem = value;
                PlacasSelectedAux = value;
                OnPropertyChanged("PlacasSelectedItem");
                if (PlacasSelectedItem != null)
                    PlacaQuenteIsChecked = StringUtil.ConvertYesNoToBoolean(PlacasSelectedItem.Slab.InfHotSlab);
                else
                    PlacaQuenteIsChecked = false;
                ExibeLaminadorDestino();
            }
            else if (CurrentEditMode != EditMode.View)
            {
                // if isn't in ViewMode, and if user clicks in another Row, will force previously row to be selected.
                placasSelectedItem = PlacasSelectedAux;
                OnPropertyChanged("PlacasSelectedItem");
            }
        }
    }

好,现在奇怪的问题:它执行了代码,我看到了代码的变化,但是SelectedIndex没有改变!数据绑定不起作用!

这是我的绑定:

<DataGrid SelectedItem="{Binding Path=PlacasSelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

谢谢你的帮助!

DataGrid设置属性,但不获取值来改变SelectedIndex

  1. 作为项目在你的网格可以是一个变化的主题,更安全的方式来访问你的(在这一点上),从UI到模型,是在控件上找到一个实际的行。您可以尝试使用如下的扩展方法:

    public static DataGridRow GetSelectedRowFromGrid(this DataGrid myDataGrid)
    {
        return (DataGridRow)
           myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem);
    }
    
  2. 在我看来(希望我正确理解你的应用程序工作流程),你的数据行必须绑定到模型,所以用户当改变一行内容,它是由DataBinding来照顾改变下面链接的模型对象,之后,你需要的唯一的事情实际上,是保存你的模型对象所以没有任何UI访问需要

好的,问题解决了。到xaml的Datagrid:

IsHitTestVisible="{Binding Path=IsEditing, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBooleanConverter}}" 

创建静态资源:

   <Page.Resources>
    <ut:InverseBooleanConverter x:Key="InverseBooleanConverter" />
   <Page.Resources>

这将反转布尔值以禁用更改Datagrid行选择,使用这个方法:

/// <summary>
/// Convert bool to !bool
/// </summary>
[ValueConversion(typeof(Boolean), typeof(Boolean))]
public class InverseBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        return !(Boolean)value;
    }
    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

现在用户不能选择DataGrid中的任何其他行!谢谢你的帮助