2016-12-27 11 views
0

Я надеюсь, что кто-то может мне помочь. У меня есть приложение MVVMLight, в котором у меня есть наблюдаемая коллекция объектов, в моей модели представления, связанной с свойством ItemsSource WPF DataGrid. Теперь я хочу изменить цвет фона строки всякий раз, когда определенное значение, называемое «TaskAssignmentStatus», изменяется для любого элемента внутри наблюдаемой коллекции.Связывание цвета строки WPF Datagrid с элементом элемента внутри наблюдаемой коллекции

Однако я получаю ошибку XAML Синтаксическую следующим образом: { ". Операция не действует при ItemsSource в использовании Access и изменять элементы с ItemsControl.ItemsSource вместо"}

Я прочитал все, что я могу найти относительно этой ошибки, но я не смог увидеть, как применить все, что я узнал, от ответов, данных до сих пор в моей конкретной ситуации. Я очень много нового для WPF и databiding, поэтому любая помощь будет очень оценена. Благодаря!

Соответствующий код с моей точки зрения-модели выглядит следующим образом:

//Contains the actual tasks on the currently selected team member's  
//work-list 
public ObservableCollection<WorklistTask> TasksForSelectedTeamMember 
{ 
    get { return _tasksForSelectedTeamMember; } 
    set 
    { 
     if (value != null) 
     { 
      _tasksForSelectedTeamMember = value; 
      RaisePropertyChanged("TasksForSelectedTeamMember"); 
     } 
    } 
} 

Вот определение класса для типов внутри моей наблюдаемой коллекции в представлении-модели:

public class WorklistTask : ICloneable 
{ 
    #region Fields 

    private int _taskId; 
    private int _activityId; 
    private string _activityName; 
    private string _activityStatus; 
    private string _taskAssignDate; 
    private string _activityStartDate; 
    private string _activityDueDate; 
    private string _caseStartDate; 
    private string _caseDueDate; 
    private int _caseId; 
    private string _caseType; 

    //an enum which indicates whether or not the task has been reassigned 
    private WorkListTaskAssignmentStatus _taskAssignmentStatus; 

    private int _sourceTaskId; 
    private bool _selectedByUserInUI = false; 


    #endregion 

    #region Constructors 

    public WorklistTask() { } 

    #endregion 

    #region Properties 

    [DisplayName("Task Assignment Status")] 
    public WorkListTaskAssignmentStatus TaskAssignmentStatus 
    { 
     get { return _taskAssignmentStatus; } 
     set { _taskAssignmentStatus = value; } 
    } 


    public int TaskId 
    { 
     get { return _taskId; } 
     set { _taskId = value; } 
    } 


    public int ActivityId 
    { 
     get { return _activityId; } 
     set { _activityId = value; } 
    } 

    [DisplayName("Activity Name")] 
    public string ActivityName 
    { 
     get { return _activityName; } 
     set { _activityName = value; } 
    } 
    [DisplayName("Activity Status")] 
    public string ActivityStatus 
    { 
     get { return _activityStatus; } 
     set { _activityStatus = value; } 
    } 
    [DisplayName("Task Assigned Date")] 
    public string TaskAssignDate 
    { 
     get { return _taskAssignDate; } 
     set { _taskAssignDate = value; } 
    } 
    [DisplayName("Activity Start Date")] 
    public string ActivityStartDate 
    { 
     get { return _activityStartDate; } 
     set { _activityStartDate = value; } 
    } 
    [DisplayName("Activity Due Date")] 
    public string ActivityDueDate 
    { 
     get { return _activityDueDate; } 
     set { _activityDueDate = value; } 
    } 
    [DisplayName("Case Start Date")] 
    public string CaseStartDate 
    { 
     get { return _caseStartDate; } 
     set { _caseStartDate = value; } 
    } 
    [DisplayName("Case Due Date")] 
    public string CaseDueDate 
    { 
     get { return _caseDueDate; } 
     set { _caseDueDate = value; } 
    } 

    [DisplayName("Case Id")] 
    public int CaseId 
    { 
     get { return _caseId; } 
     set { _caseId = value; } 
    } 
    [DisplayName("Case Type")] 
    public string CaseType 
    { 
     get { return _caseType; } 
     set { _caseType = value; } 
    } 


    public int SourceTaskId 
    { 
     get { return _sourceTaskId; } 
     set { _sourceTaskId = value; } 
    } 

    public bool SelectedByUserInUI 
    { 
     get { return _selectedByUserInUI; } 
     set { _selectedByUserInUI = value; } 
    } 

    #endregion 

    #region Methods 

    public object Clone() 
    { 
     WorklistTask newWorklistTask = (WorklistTask)this.MemberwiseClone(); 
     newWorklistTask.ActivityName = string.Copy(ActivityName); 
     newWorklistTask.ActivityStatus = string.Copy(ActivityStatus); 
     newWorklistTask.TaskAssignDate = string.Copy(TaskAssignDate); 
     newWorklistTask.ActivityStartDate = string.Copy(ActivityStartDate); 
     newWorklistTask.ActivityDueDate = string.Copy(ActivityDueDate); 
     newWorklistTask.CaseStartDate = string.Copy(CaseStartDate); 
     newWorklistTask.CaseDueDate = string.Copy(CaseDueDate); 
     newWorklistTask.CaseType = string.Copy(CaseType); 

     return newWorklistTask; 
    } 

    #endregion 
} 

Вот перечисление:

public enum WorkListTaskAssignmentStatus 
{ 
    Automatic, 
    Added, 
    Removed, 
    DeleteLocal 
} 

Вот XAML для DataGrid Я пытаюсь формат:

<DataGrid x:Name="WorklistOfSelectedTeamMember" 
      ItemsSource="{Binding TasksForSelectedTeamMember, Mode=TwoWay, 
      UpdateSourceTrigger=PropertyChanged}"     
      AutoGeneratingColumn="GenerateColumnsForWorklist"         
      IsReadOnly="True" 
      FontWeight="Normal" 
      FontSize="13" 
      SelectionMode="Extended" 
      AlternatingRowBackground="LightGray" 
      Grid.Column="0" 
      Grid.ColumnSpan="2" 
      Grid.Row="3" 
      Margin="0,0,5,0" 
      HorizontalScrollBarVisibility="Auto" 
      Height="150" 
      Style="{StaticResource DataGridColoring}"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <cmd:EventToCommand Command="{Binding 
       WorklistTaskSelectionChangedCommand}" 
       CommandParameter="{Binding SelectedItems, 
       ElementName=WorklistOfSelectedTeamMember}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Automatic"> 
        <Setter Property="Background" Value="Transparent"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Removed"> 
        <Setter Property="Background" Value="#C4FF0000"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Added"> 
        <Setter Property="Background" Value="#00FF7F"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="DeleteLocal"> 
        <Setter Property="Background" Value="#00FFFFFF"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style>        
</DataGrid> 

ответ

0

Вы можете избавиться от ошибки вы получаете путем добавления неявного RowStyle к ресурсам словаря в DataGrid:

<DataGrid x:Name="WorklistOfSelectedTeamMember" 
      ItemsSource="{Binding TasksForSelectedTeamMember, Mode=TwoWay, 
      UpdateSourceTrigger=PropertyChanged}"             
      IsReadOnly="True" 
      FontWeight="Normal" 
      FontSize="13" 
      SelectionMode="Extended" 
      AlternatingRowBackground="LightGray" 
      Grid.Column="0" 
      Grid.ColumnSpan="2" 
      Grid.Row="3" 
      Margin="0,0,5,0" 
      HorizontalScrollBarVisibility="Auto" 
      Height="150"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cmd:EventToCommand Command="{Binding 
       WorklistTaskSelectionChangedCommand}" 
       CommandParameter="{Binding SelectedItems, 
       ElementName=WorklistOfSelectedTeamMember}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <DataGrid.Resources> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Automatic"> 
        <Setter Property="Background" Value="Transparent"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Removed"> 
        <Setter Property="Background" Value="#C4FF0000"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="Added"> 
        <Setter Property="Background" Value="#00FF7F"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding TaskAssignmentStatus}" 
       Value="DeleteLocal"> 
        <Setter Property="Background" Value="#00FFFFFF"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.Resources> 
</DataGrid> 

Также обратите внимание, что если вы хотите, чтобы цвет фона строки изменить когда вы устанавливаете значение свойства TaskAssignmentStatus элемента в вашем ObservableCollection для нового значения динамически во время выполнения, класс WorklistTask должен реализовать интерфейс INotifyPropertyChanged и поднять событие PropertyChanged в настройщике свойства TaskAssignmentStatus.

+0

Большое вам спасибо за ваш ответ. Это было то, что мне нужно было решить, поэтому я очень благодарен! –

0

Ваш код для изменения цвета фона выглядит просто отлично, и он должен работать.

Строка ошибки вы упоминаете не об этом, то это означает, что вы пытаетесь как-то добавлять/удалять элементы непосредственно из свойства ItemsSource в DataGrid DataGrid.ItemsSource

Вы не можете использовать ItemsSource для непосредственного изменения ваши элементы вы должны использовать коллекцию.

+0

Спасибо Poncianux, я ценю ваши идеи. Я дважды проверял, что вы упомянули, может быть, это просто вопрос. Так спасибо за вашу помощь! –