Установка цвета фона строки в XAML DataGrid на основе состояния редактирования - PullRequest
2 голосов
/ 19 марта 2012

Следующий XAML отлично работает для изменения цвета фона при редактировании строки:

  <DataGrid.RowStyle>
      <Style TargetType="DataGridRow" >
          <Setter Property="Background"  Value="AntiqueWhite" />
          <Style.Triggers>
              <Trigger Property="IsEditing" Value="true">
                  <Setter Property="Background" Value="red" />
              </Trigger>
          </Style.Triggers>
      </Style>
   </DataGrid.RowStyle>

Но мне также хотелось бы следующее поведение:

  • Изменить обратно на цвет по умолчанию после сохранения
  • Если редактирование отменено, верните цвет по умолчанию

Любые предложения о том, как это сделать?

UPDATE

Чуть больше ясности - он ведет себя так, как я и ожидал, из приведенного выше кода - просто ищет что-то другое. Он меняет цвет спины, но только когда я редактирую строку. Когда я покидаю эту строку (перед сохранением изменений), цвет фона возвращается к значению по умолчанию. Я хотел бы, чтобы редактирование backcolour оставалось в каждой отредактированной строке до тех пор, пока изменения не будут сохранены. Если перед сохранением я верну данные без изменений в статистику, я бы хотел, чтобы цвет фона вернулся к значению по умолчанию.

Вот еще код:

    <DataGrid EnableRowVirtualization="True" ItemsSource="{Binding CurrentTransactionList}" AutoGenerateColumns="false" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Margin="5" Name="TransactionTable" VerticalAlignment="Stretch" RowEditEnding="TransactionTable_RowEditEnding">
<DataGrid.RowStyle>
    <Style TargetType="DataGridRow" >
        <Setter Property="Background"  Value="AntiqueWhite" />
        <Style.Triggers>
            <Trigger Property="IsEditing" Value="true">
                <Setter Property="Background" Value="red" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
    <DataGridTextColumn Header="ID" Width="40" Binding="{Binding Id}" IsReadOnly="True" Foreground="Gray" />
    <DataGridTextColumn Header="Label" Width="250" Binding="{Binding Label}" />
    <DataGridComboBoxColumn Header="Stat" SelectedItemBinding="{Binding Stat}" ItemsSource="{Binding Source={StaticResource stats}}"  Width="125" />
    <DataGridTextColumn Header="Change" Binding="{Binding Change}" Width="75" />
</DataGrid.Columns>    

Обработчик события TransactionTable_RowEditEnding просто активирует кнопку обновления.

Это релевантная ViewModel:

    private ObservableCollection<StatTransactionValue> currentTransactionList;
    public ObservableCollection<StatTransactionValue> CurrentTransactionList {
        get { return currentTransactionList; }
        set {
            if (value != currentTransactionList) {
                currentTransactionList = value;
                NotifyPropertyChanged("CurrentTransactionList");
            }
        }
    }

    public void SetCurrentTransactionList(long ItemId) {
        CurrentTransactionList = Gateway.GetTransactions(ItemId);
    }

    public void UpdateTransactions() {
        Gateway.UpdateTransactions(CurrentTransactionList);
    }

Шлюз - это простой вызов Sqlite с использованием ServiceStack OrmLite Sqlite.

Мысли

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я бы предложил новое свойство в модели представления, например, IsDirty, затем вы можете активировать его, используя DataTrigger, вам, конечно, придется изменить свойство самостоятельно, используя правильные DataGrid события. или внутренние уведомления об изменениях.

0 голосов
/ 19 марта 2012

На вашем месте я бы посмотрел на установку UpdateSourceTrigger на Явное и затем на запуск метода UpdateSource , когда вы хотите зафиксировать изменения в модели представления. Таким образом, вы можете указать, когда на самом деле происходит редактирование свойств.

Я бы поиграл с этим, чтобы увидеть, как IsEditing соответствует этому. Я никогда раньше не использовал это значение UpdateSourceTrigger, поэтому понятия не имею. По крайней мере, это будет контролировать, как правильно обновляются свойства.

В противном случае, если это нехорошо, то, что Х.Б. Сказано точно, вот как ты должен это делать.

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