2015-09-25 102 views
0

我有3列。一个带有复选框,一个带有文本列和一个带有下拉列。wpf中的datagrid绑定布尔值

我将整个表项目源绑定到StepTaskViewInfo.CurrentStep.ProjectTasks.Items。 StepTaskViewInfo是我的虚拟机中的一个变量,其他的嵌套在它中。这工作正常。

唯一不起作用的是FIRST Columns的IsReadOnly属性。假设这是一个问题,因为我的项目源是不同的,并且只读属性与视图模型的嵌套级别不同。

For grid : 
Items Source = StepTaskViewInfo -> CurrentStep -> ProjectTasks- >Items 

For read only propety of each column(which doesnt work) : 

IsReadOnly="{Binding StepTaskViewInfo.AreStepsTasksReadonly 


StepTaskViewInfo => AreStepsTasksReadonly 



     <DataGrid RowHeaderWidth="0" x:Name ="TaskDataGrid" Margin="20,0,0,0" ItemsSource="{Binding StepTaskViewInfo.CurrentStep.ProjectTasks.Items}" AutoGenerateColumns="False" 
          CanUserSortColumns="False" HorizontalAlignment="Left" CanUserAddRows="False" SelectionChanged="TaskRowSelectionChanged" 
             ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
             Background="White" BorderThickness ="0" 
             ScrollViewer.CanContentScroll="True" Height="240"> 
           <DataGrid.Columns> 
            <DataGridTemplateColumn Width ="60" HeaderStyle="{StaticResource HeaderStyle}" Header="Selected" IsReadOnly="{Binding StepTaskViewInfo.AreStepsTasksReadonly,UpdateSourceTrigger=PropertyChanged }"> 
             <DataGridTemplateColumn.CellTemplate> 
              <DataTemplate> 
               <CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" 
                  IsEnabled="{Binding IsTaskEnabled,UpdateSourceTrigger=PropertyChanged}" /> 
              </DataTemplate> 
             </DataGridTemplateColumn.CellTemplate> 
            </DataGridTemplateColumn> 



     //Column 2 
            <DataGridTextColumn HeaderStyle="{StaticResource HeaderStyle}" Header="Tasks" Width ="*" Binding="{Binding Name}" IsReadOnly="True"> 
             <DataGridTextColumn.ElementStyle> 
              <Style TargetType="TextBlock"> 
               <Setter Property="TextWrapping" Value="Wrap" /> 
              </Style> 
             </DataGridTextColumn.ElementStyle> 
             <DataGridTextColumn.EditingElementStyle> 
              <Style TargetType="TextBox"> 
               <Setter Property="TextWrapping" Value="Wrap" /> 
               <Setter Property="AcceptsReturn" Value="true" /> 
              </Style> 
             </DataGridTextColumn.EditingElementStyle> 
            </DataGridTextColumn> 




     //Column 3 


            <DataGridTemplateColumn HeaderStyle="{StaticResource HeaderStyle}" Header="Status" Width ="130"> 
             <DataGridTemplateColumn.HeaderTemplate > 
              <DataTemplate> 
               <StackPanel Orientation="Horizontal" Width="130"> 
                <Label Content ="Status" HorizontalAlignment="Left" Margin ="0,0,0,0"/> 
                <ComboBox Name ="DefaultStatusComboBox" ItemsSource="{StaticResource Status}" Width="86" DropDownClosed="DefaultStatusComboBox_DropDownClosed" /> 
               </StackPanel> 
              </DataTemplate> 
             </DataGridTemplateColumn.HeaderTemplate> 
             <DataGridTemplateColumn.CellTemplate> 
              <DataTemplate> 
               <ComboBox SelectedItem="{Binding Status, UpdateSourceTrigger=PropertyChanged}" Height ="26" VerticalAlignment="Top" IsReadOnly ="{Binding StatusIsReadOnly}" 
                IsEnabled ="{Binding IsSelected}" ItemsSource="{StaticResource Status}"/> 
              </DataTemplate> 
             </DataGridTemplateColumn.CellTemplate> 
            </DataGridTemplateColumn> 
           </DataGrid.Columns> 
          </DataGrid> 





view model: 

public class StepTaskViewModel : INavigationAware, INotifyPropertyChanged 
    { 


private readonly IProjectWorkflowService projectWorkflowService; 
    private bool isVisible = true; 
    private readonly IUserService userService; 



     private string stageId; 
     private StepTaskViewInfo stepTaskViewInfo; 

     public StepTaskViewModel(IProjectWorkflowService projectWorkflowService, IUserService userService) 
     { 
      this.projectWorkflowService = projectWorkflowService; 
      this.userService = userService; 
      StepTaskViewInfo=new StepTaskViewInfo(); 
     } 

     public StepTaskViewInfo StepTaskViewInfo 
     { 
      get { return stepTaskViewInfo; } 
      set 
      { 
       stepTaskViewInfo = value; 

       OnPropertyChanged(); 
      } 
     } 

     // set current step - >load tasks - > set display names for each task --> set drop down source for current step 


     public string StageId 
     { 
      get { return stageId; } 
      set 
      { 
       stageId = value; 
       StepTaskViewInfo.PeerReview.StageId = stageId; 
       LoadData(); 
      } 
     } 




     #region navigation 
     public void OnNavigatedTo(NavigationContext navigationContext) 
     { 
      StageId =(string) navigationContext.Parameters["StageId"] ; 
      IsVisible = true; 

     } 

     public bool IsNavigationTarget(NavigationContext navigationContext) 
     { 
      return true; 
     } 

     public void OnNavigatedFrom(NavigationContext navigationContext) 
     { 
      if (!IsVisible) 
       return; 
      IsVisible = false; 
     } 

     public bool IsVisible 
     { 
      get { return isVisible; } 
      set 
      { 
       isVisible = value; 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      var handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     #endregion 

     // called when stage id changes 
     public void LoadData() 
     { 

      var stepTaskViewInfo = projectWorkflowService.LoadProjectStepTaskInfo(StageId); 

      if (StepTaskViewInfo.CurrentStep != null) 
      { 
       StepTaskViewInfo.CurrentStep.ProjectTasks.Items.Clear(); 
      } 
      StepTaskViewInfo.AllTeamMembers = stepTaskViewInfo.AllTeamMembers; 
      StepTaskViewInfo.ProjectSteps = stepTaskViewInfo.ProjectSteps; 
      StepTaskViewInfo.PeerReview = stepTaskViewInfo.PeerReview; 
      StepTaskViewInfo.AreStepsTasksReadonly = stepTaskViewInfo.AreStepsTasksReadonly; 
      StepTaskViewInfo.PeerReview.Documents.Items.Add(new ActivityArtifact { FileName = string.Empty }); 
     } 




     private string GetAliases(ObservableCollection<SelectableTeamMember> selectedStepMembers) 
     { 
      string aliases= selectedStepMembers.Aggregate("", (current, member) => current + (member.Alias + ";")); 
      aliases= aliases.TrimEnd(';'); 
      return aliases; 
     } 
     private string GetDisplayNames(ObservableCollection<SelectableTeamMember> selectedStepMembers) 
     { 
      string names = selectedStepMembers.Aggregate("", (current, member) => current + (member.Name + ";")); 
      names= names.TrimEnd(';'); 
      return names; 
     } 

     public void AssignResourcesToStep(ObservableCollection<SelectableTeamMember> selectedStepMembers) 
     { 
      StepTaskViewInfo.CurrentStep.StepTeamMembers = selectedStepMembers; 
      StepTaskViewInfo.CurrentStep.Resources = GetAliases(selectedStepMembers); 
      StepTaskViewInfo.CurrentStep.StepResourceDisplayName = GetDisplayNames(selectedStepMembers); 


      foreach (var task in StepTaskViewInfo.CurrentStep.ProjectTasks) 
      { 
       task.AllTaskTeamMembers = StepTaskViewInfo.CurrentStep.StepTeamMembers; 
       task.Resources = GetAliases(StepTaskViewInfo.CurrentStep.StepTeamMembers); 
       task.TaskResourceDisplayName = GetDisplayNames(StepTaskViewInfo.CurrentStep.StepTeamMembers); 
      } 
     } 

     public void AssignResourcesToTask(ObservableCollection<SelectableTeamMember> selectedTaskMembers, string taskId) 
     { 

      var task = StepTaskViewInfo.CurrentStep.ProjectTasks.First(st => st.Id == taskId); 
      task.Resources = GetAliases(selectedTaskMembers); 
      task.TaskResourceDisplayName = GetDisplayNames(selectedTaskMembers); 

     } 

     public void AssignTaskTips(string ttid) 
     { 

      string taskTip = projectWorkflowService.GetTaskTip(ttid); 


      foreach (var task in StepTaskViewInfo.CurrentStep.ProjectTasks) 
      { 
       if (task.TemplateTaskId == ttid) 
        task.TaskTip = taskTip; 
      } 

     } 

     #region peerreview 
     public void DownloadDocument(string artifactId, string fileName) 
     { 
      projectWorkflowService.DownloadActivityArtifact(artifactId, fileName); 
     } 
     public void UploadDocument(string artifactId,string file) 
     { 
      projectWorkflowService.UploadActivityArtifact(StageId, artifactId, file); 
      var projectDocuments = projectWorkflowService.LoadPeerReviewDocuments(StageId); 
      projectDocuments.Items.Add(new ActivityArtifact { FileName = string.Empty }); 

      StepTaskViewInfo.PeerReview.Documents = projectDocuments; 
     } 

     private void GetUsers() 
     { 
      foreach (ProjectPeerReview t in StepTaskViewInfo.PeerReview.Reviews.Items.ToList()) 
      { 
       if (string.IsNullOrEmpty(t.Id)) 
       { 
        if (!string.IsNullOrEmpty(t.Alias)) 
        { 
         User current = userService.SearchAlias(t.Alias); 

         if (current == null) 
         { 
          MessageBox.Show("Could not find reviewer " + t.Alias); 
          StepTaskViewInfo.PeerReview.Reviews.Items.Remove(t); 
         } 
         else 
         { 
          t.Name = current.Name; 
         } 
        } 
       } 
      } 
     } 

     internal User[] GetSearchingUsersName(string name) 
     { 
      return userService.Search(name); 
     } 

     #endregion 

     public void UpdateTaskStatus(object selectedValue) 
     { 
      foreach (var task in StepTaskViewInfo.CurrentStep.ProjectTasks) 
      { 
       task.Status = selectedValue.ToString(); 
      } 
     } 

     public void LoadTasksForCurrentStep() 
     { 
      StepTaskViewInfo.CurrentStep.ProjectTasks = projectWorkflowService.LoadProjectTasks(StepTaskViewInfo.CurrentStep.Id); 

      StepTaskViewInfo.UpdateTaskResources(); 
     } 

     public void SaveCurrentTasksWithStep() 
     { 
      if (StepTaskViewInfo.CurrentStep != null) 
      { 
       projectWorkflowService.SaveTasksWithStep(StageId, StepTaskViewInfo.CurrentStep, StepTaskViewInfo.CurrentStep.ProjectTasks); 
      } 
     } 

     public bool SaveData() 
     { 
      if (StepTaskViewInfo.CurrentStep != null) 
      { 
       GetUsers(); 
       return projectWorkflowService.SaveStepTaskViewInfo(StepTaskViewInfo, StageId); 
      } 
      return true; 
     } 
    } 



} 
+1

请后视图模型代码结构。 – Sandesh

回答

1

DataGridColumn.IsReadOnly属性将使列中的所有单元格为ReadOnly或不是ReadOnly。 DataGridCell.IsReadOnly属性也不可分配。你所要做的就是如果某个其他属性是错误的,只是只写一个列,否则列应该是可编辑的。最好使用模板列并相应地设置控件。 MSDN

例如,如果我想用户编辑CarNumber属性值为HasCar属性值是别的真没有,那么如果我写:

<DataGridTextColumn Header="CarNumber" Binding="{Binding CarNumber}" IsReadOnly="{Binding HasCar"/> 

//

这仍然将允许所有列无论HasCar值如何,值都可编辑。

//

如果我使用模板列,并使用DataTrigger然后我得到预期的效果。这不会允许用户输入/编辑CarNumber如果HasCar属性是假的:只要你想你的复选框仍然可见,但没有启用

<DataGridTemplateColumn Header="CarNumber" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate>        
          <TextBox x:Name="TxtCarNumber" Text="{Binding CarNumber}" > 
          <TextBox.Style> 
           <Style TargetType="TextBox"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding HasCar}" Value="False"> 
                   <Setter Property="TextBox.Visibility" Value="Hidden"/> 
                   <Setter Property="TextBox.Width" Value="100"/> 
                  </DataTrigger> 
             <DataTrigger Binding="{Binding HasCar}" Value="True"> 
                   <Setter Property="TextBox.Visibility" Value="Visible"/> 
                   <Setter Property="TextBox.Background" Value="Red"/> 
                  </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </TextBox.Style> 
          </TextBox>        
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

在你的代码为此,:

<DataGridTemplateColumn Width ="60" HeaderStyle="{StaticResource HeaderStyle}" Header="Selected" > 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
      <Grid IsEnabled={Binding StepTaskViewInfo.AreStepsTasksReadonly}> 
       <CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" 
IsChecked="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" 
       IsEnabled="{Binding IsTaskEnabled,UpdateSourceTrigger=PropertyChanged}" /> 
      </Grid> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
+0

根本不起作用 –

+0

@PrasaanthNeelakandan您最好知道您的代码以及StepTaskViewInfo.AreStepsTasksReadonly是从哪里来的。如果StepTaskViewInfo.AreStepsTasksReadonly值为false,则DataTemplate中的整个Grid将被禁用,因此也是您的组合框。我将发布一个工作解决方案来展示这一点 – AnjumSKhan

+0

@PrasaanthNeelakandan如果StepTaskViewInfo.AreStepsTasksReadonly为false,那么该行中的组合框将无法访问,因为包含它的Grid将被禁用。 – AnjumSKhan