2017-01-10 2 views
0

Ниже приведен код, который почти работает так, как я хочу. Я пытаюсь получить его, поэтому вы нажимаете на строку, и я беру идентификатор программы и использую его в другом месте, эта часть работает. Однако я не хочу, чтобы ничего не случилось, если я нажму на столбец статуса, который имеет встроенный combobox, как я ограничу его использованием этого столбца? Я использую MVVM, если это необходимоXAML Datagrid, выбранное значение, но только для некоторых столбцов

<DataGrid x:Name="gridResult" IsSynchronizedWithCurrentItem="True" SelectedValue ="{Binding ModelRequestSV}" Grid.Row="2" Grid.RowSpan="5" Grid.ColumnSpan="4" IsReadOnly="TRue" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" CanUserAddRows="false" AutoGenerateColumns="False" ItemsSource="{Binding ModelRequestObs}" HorizontalGridLinesBrush="Gray" GridLinesVisibility="Horizontal" Style=" {DynamicResource DataGridStyle1}" Margin="0,25,0,10" > 
     <DataGrid.InputBindings> 
      <MouseBinding 
     MouseAction="LeftDoubleClick" 
     Command="{Binding DoubleClickCommand}" 
     CommandParameter="{Binding ModelRequestSV}"/> 
     </DataGrid.InputBindings> 

<DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding ProgramID}" Header="Program ID" Width="100" /> 
      <DataGridTextColumn Binding="{Binding Cedant}" Header="Cedant" Width="300" /> 
      <DataGridTextColumn Binding="{Binding UWCode}" Header="Underwriter" Width="145"/> 
      <DataGridTextColumn Binding="{Binding DateSubmitted}" Header="Date Submitted" Width="145"/> 
      <DataGridTextColumn Binding="{Binding RequiredDate}" Header="Required Date" Width="145"/> 
      <DataGridTextColumn Binding="{Binding Priority}" Header="Priority" Width="145"/> 
      <DataGridTemplateColumn Header="Status" Width="140">      
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Width="110" Text="{Binding Status}" /> 
          <ComboBox Text="{Binding Status}" 
          Width="20" Height="20" 
             BorderThickness="0" 

          SelectedItem="{Binding Status}" 
          ItemsSource="{Binding DataContext.StatusCodes, ElementName=userControl}" 
          SelectionChanged="DataGrid_SelectionChanged"> 

          </ComboBox> 
         </StackPanel> 

        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

вот моя ViewModel логика

private ModelRequest _modelRequestSV; 
    private void NotifyProgrIdToParent() 
    { 
     CAT_Application_WPF.UI.App.MainViewModel.ProgIdCommand.Execute(_modelRequestSV.ProgramID.ToString()); 


    } 
    public ModelRequest ModelRequestSV 
    { 
     get { return _modelRequestSV; } 
     set 
     { 
      if (value != _modelRequestSV) 
      { 
       _modelRequestSV = value; 
       OnPropertyChanged(nameof(ModelRequestSV)); 
       if (ModelRequestSV != null) 
       { 
        NotifyProgrIdToParent(); 
       } 



      } 
     } 
    } 

попытку. firstSelectedCell.Column.DisplayIndex.ToString() всегда возвращает «0» независимо от того, где я нажимаю, в чем проблема?

private void DataGrid_MouseDoubleClick(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     System.Windows.Controls.DataGrid myGrid = (System.Windows.Controls.DataGrid)sender; // now this is strongly typed so we can drill into its properties. 
     var vm = (NotesManagerViewModel)DataContext; 
     var selectedCells = myGrid.SelectedCells; // there can be more than one cell selected! Which column is that in? 
     if (selectedCells.Count > 0) 
     { 
      DataGridCellInfo firstSelectedCell = selectedCells[0]; // usually there will be only one selected. If not, think about how you want to handle this. 
      DataGridColumn ignoreThisColumn = myGrid.Columns[7]; // whichever column you want to ignore - you could also have several columns in an array... 

      if (firstSelectedCell.Column.DisplayIndex.ToString() != ignoreThisColumn.DisplayIndex.ToString()) 
      { 
       vm.NotifyProgrIdToParent(); 
      } 
     } 
    } 

ответ

0

В обработчике события DataGrid_SelectionChanged, у вас есть отправитель объекта - я забываю экспромтом, что отправитель (я думаю, что это DataGrid), но если вы накладываете отправитель своего типа, то вы можете проверить его в ваш код, чтобы увидеть, какой столбец был нажат. Если вы не хотите ничего делать, когда щелкнете этот столбец, просто пропустите оставшуюся часть кода. Это не проверено, но должно указывать на правильное направление:

private void DataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    DataGrid myGrid = (DataGrid)sender; // now this is strongly typed so we can drill into its properties. 

    var selectedCells = myGrid.SelectedCells; // there can be more than one cell selected! Which column is that in? 
    if (selectedCells.Count > 0) 
    { 
     DataGridCellInfo firstSelectedCell = selectedCells[0]; // usually there will be only one selected. If not, think about how you want to handle this. 
     DataGridColumn ignoreThisColumn = myGrid.Columns[1]; // whichever column you want to ignore - you could also have several columns in an array... 

     if (firstSelectedCell.Column != ignoreThisColumn) 
     { 
      // do your logic here - we know they clicked on some other column... 
     } 
    } 
} 
+0

Я буду редактировать то, что моя текущая логика. Могу ли я просто взять логику с виртуальной машины и разместить ее там? – James

+0

Похоже, что у вас есть двойной щелчок, обрабатываемый кодом в вашей виртуальной машине, а SelectionChanged обрабатывается вашим кодом (SelectionChanged = "DataGrid_SelectionChanged") - этот ответ будет применяться к коду. Если вы хотите, чтобы проверки выполнялись в вашей виртуальной машине, то все, с чем вам нужно работать, это ModelRequestSV - я не уверен, можете ли вы понять это или нет. Из вашей виртуальной машины у вас нет прямого представления о представлении (и вы этого не хотите - это нарушит MVVM). Поскольку «столбец, который был нажат», зависит от вида, этот тип логики, вероятно, принадлежит коду позади. –

+0

Хотя пуристы будут меня в 3 ... 2 ... 1 ... –

Смежные вопросы