DataGrid устанавливает свойство, но не получает значение для изменения SelectedIndex - PullRequest
0 голосов
/ 19 октября 2011

У меня странная проблема в датагриде. Я использую WPF с DataBinding, у меня есть DataGrid и 3 кнопки на странице - «Сохранить», «Обновить», «Отмена» - и много меток. Эти ярлыки, когда пользователь нажимает кнопку «Обновить», активируют режим редактирования для этих ярлыков.

В режиме редактирования этот пользователь не может изменить SelectedIndex этой таблицы (это моя проблема). Я пытался создать свойство IsNotEditable, привязку к IsEnabled = "" этого DataGrid, но если оно отключено, текущая строка не выбрана.

Я не могу это использовать, потому что когда пользователь нажимает Сохранить, я сохраняю выбранную строку. Итак ... Я создал другое свойство PlacasSelectedItem и свойство 'Support' 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}" />

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

хорошо, проблема решена. В сетку данных XAML:

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

Создан статический ресурс:

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

   <Page.Resources>

Это инвертирует логическое значение, чтобы отключить изменение выбора строки таблицы данных, используя этот метод:

/// <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! Спасибо за вашу помощь:)

0 голосов
/ 19 октября 2011
  1. Поскольку элемент в вашей сетке может подвергаться изменениям, более безопасный способ доступа к вашей строке (на данный момент), от пользовательского интерфейса к модели, состоит в том, чтобы найти фактически строку на контроль. Вы можете попробовать использовать метод расширения, примерно такой:

    public static DataGridRow GetSelectedRowFromGrid(this DataGrid myDataGrid)
    {
    
        return (DataGridRow)
           myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.SelectedItem);
    }
    
  2. Мне кажется (надеюсь, я правильно понимаю рабочий процесс вашего приложения), что ваши данные в строке должны быть привязаны к модели, поэтому пользователь, когда он изменяет содержимое строки, может до DataBinding принять Позаботьтесь об изменении нижнего связанного объекта модели, и после этого единственное, что вам на самом деле нужно, - это сохранить ваш объект модели , , поэтому никакой доступ к пользовательскому интерфейсу не требуется .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...