2013-11-14 17 views
5
Ben 4,0

DataGrid WPF Sanallaştırma ve Komut CanExecute

Ben bir DataGrid ile ilgili bir sorun çerçeve .NET ile WPF uygulama üzerinde çalışıyorum

:

public ICommand MoveUpOrderPipeCommand 
{ 
    get 
    { 
     if (_moveUpOrderPipeCommand == null) 
     { 
       _moveUpOrderPipeCommand = new Command<OrderPipeListUIModel>(OnMoveUpOrderPipe, CanMoveUpOrderPipe); 
     } 
       return _moveUpOrderPipeCommand; 
     } 
} 

private bool CanMoveUpOrderPipe(OrderPipeListUIModel orderPipe) 
{ 
    if (OrderPipes == null || !OrderPipes.Any() || OrderPipes.First() == orderPipe) 
      return false; 
    return true; 
} 

Ve vardır: Her hat 2 komutları var

<DataGrid Grid.Row="1" IsReadOnly="True" ItemsSource="{Binding OrderPipes}" SelectionMode="Extended"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Diam. (mm)" Binding="{Binding Diameter}" Width="120"> </DataGridTextColumn> 
     <DataGridTextColumn Header="Lg. (m)" Binding="{Binding Length}" Width="120"></DataGridTextColumn> 
     <DataGridTextColumn Header="Ep. (mm)" Binding="{Binding Thickness}" Width="120"></DataGridTextColumn> 
     <DataGridTextColumn Header="Ondulation" Binding="{Binding Ripple}" Width="120"></DataGridTextColumn> 
     <DataGridTemplateColumn> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.MoveUpOrderPipeCommand}" CommandParameter="{Binding}"> 
        </Button> 
       </StackPanel> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
:

Ve DataGrid moveDown için aynı komut (hat sonuncusu değilse denetimi yürütmek Can)

EnableRowVirtualization ile kılavuzumu true olarak sanallaştırırsam, aşağıdan kaymaya devam edersem (ilk satırlar artık görünmüyorsa) biraz sorun yaşıyorum ve sonra da en üste geri döner, bazen ilk satırın düğmeyi hareket ettirir DataGrid'i tıklayana kadar etkinleştir, ikinci veya üçüncü devre dışı bırak, etkin olmalı! i false EnableRowVirtualization ayarlarsanız, ben bu sorun yok

...

Sadece bu sorun hakkında konuşmak internette bir başka yazı bulundu, ancak .net framework DataGrid yoktur : http://www.infragistics.com/community/forums/t/15189.aspx

Bunu nasıl düzeltebilirim konusunda bir fikriniz var mı?

önceden

Edit teşekkür ederiz: Komut sınıfını

public class Command<T> : ICommand 
{ 
    private readonly Action<T> _execute; 
    private readonly Func<T, bool> _canExecute; 

    public Command(Action<T> execute) : this(execute, null) 
    { 
    } 

    public Command(Action<T> execute, Func<T, bool> canExecute) 
    { 
     if (execute == null) 
      throw new ArgumentNullException("execute", "Le délégué execute ne peut pas être nul"); 

     this._execute = execute; 
     this._canExecute = canExecute; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add 
     { 
      CommandManager.RequerySuggested += value; 
     } 
     remove 
     { 
      CommandManager.RequerySuggested -= value; 
     } 
    } 

    public bool CanExecute(object parameter) 
    { 
     return (_canExecute == null) ? true : _canExecute((T)parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _execute((T)parameter); 
    } 
} 
+0

CanExecute'niz başlatıldı mı? –

+0

"Komut" sınıfının kodunu yazınız. –

+0

Kaydırmada CanExecute çalışmaz – Tan

cevap

4

Eğer fare tekerleği ile kaydırma yaparken sorun, CanExecute çağrılmaz.

Bunu düzeltmek için bir AttachedProperty oluşturuyorum ve bir stilde kullanılabilir.

public static readonly DependencyProperty CommandRefreshOnScrollingProperty = DependencyProperty.RegisterAttached(
      "CommandRefreshOnScrolling", 
      typeof(bool), 
      typeof(DataGridProperties), 
      new FrameworkPropertyMetadata(false, OnCommandRefreshOnScrollingChanged)); 

private static void OnCommandRefreshOnScrollingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
     var dataGrid = d as DataGrid; 
     if (dataGrid == null) 
     { 
      return; 
     } 
     if ((bool)e.NewValue) 
     { 
     dataGrid.PreviewMouseWheel += DataGridPreviewMouseWheel; 
     } 
} 
private static void DataGridPreviewMouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    CommandManager.InvalidateRequerySuggested(); 
} 

Ve böyle bir tarzda bu attachedProperty kullanabilirsiniz: ben bu sorun var neden

<Setter Property="views:DataGridProperties.CommandRefreshOnScrolling" Value="True"></Setter> 

Teşekkür Eran Otzap bana göstermek için!