【问题标题】:DataGrid sets Property but don't get value to change SelectedIndexDataGrid 设置属性但没有获得更改 SelectedIndex 的值
【发布时间】:2011-12-11 04:17:03
【问题描述】:

我在 Datagrid 中遇到了一个奇怪的问题。我将 WPF 与 DataBinding 一起使用,我有一个 DataGrid,一个页面中有 3 个按钮 - 保存、更新、取消 - 以及很多标签。当用户单击更新按钮时,这些标签将启用这些标签的编辑模式。

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

我不能使用它,因为当用户单击保存时,我将保存该选定行。 所以...我使用以下代码创建了另一个属性 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}" />

感谢您的帮助!

【问题讨论】:

  • 让我直截了当,您有一个可编辑的数据网格,您选择一行并将其中一个单元格置于编辑模式。现在根据您的说法,问题是不允许用户将选择从该行更改为另一行?我说的对吗?

标签: c# wpf xaml data-binding datagrid


【解决方案1】:
  1. 由于网格上的项目可能会发生变化,从 UI 到模型,访问您的 (此时)更安全的方法是在控件上找到实际的一行. 您可以尝试使用扩展方法,如下所示:

    public static DataGridRow GetSelectedRowFromGrid(this DataGrid myDataGrid)
    {
    
        return (DataGridRow)
           myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem);
    }
    
  2. 在我看来(希望我正确理解您的应用程序工作流程),您的行数据必须绑定到模型,因此用户在更改行内容时,由DataBinding 采取注意更改链接的模型对象,之后,您实际上唯一需要的就是保存您的模型对象因此不需要任何 UI 访问

希望这会有所帮助。

【讨论】:

  • 谢谢你的回答,但我忘了告诉一些事情......我正在使用 MVVM,我不想使用代码隐藏,所以我需要使用属性来做到这一点。我想如果我可以阻止导航到 Datagrid,它可以解决问题。
  • @gustavosg: 使用提供的代码保存开始编辑的 ROW 就足够了。
  • 好的,问题解决了。进入 xaml: IsHitTestVisible="{Binding Path=IsEditing, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBooleanConverter}}" 这反转布尔值以禁用更改 Datagrid 行选择。
  • 使用了这个方法:[ValueConversion(typeof(Boolean), typeof(Boolean))] public class InverseBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo文化){返回!(布尔)值; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfoculture) { throw new NotSupportedException(); } }
【解决方案2】:

好的,问题解决了。进入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 中的任何其他行! 谢谢你的帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2018-04-21
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多