2013-11-14 11 views
5

मैं ढांचे नेट के साथ एक WPF आवेदन पर काम कर रहा हूँ 4.0डेटा ग्रिड WPF वर्चुअलाइजेशन और कमान CanExecute

मैं एक डेटा ग्रिड के साथ एक समस्या है:

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; 
} 

और वहाँ है: हर पंक्ति 2 आदेशों मिला MoveDown के लिए एक ही आदेश (जांच निष्पादित कर सकते हैं अगर लाइन पिछले एक नहीं है)

और डेटा ग्रिड:

<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> 

तो मैं सच करने के लिए EnableRowVirtualization के साथ अपने ग्रिड virtualize, मैं कुछ परेशानी है, अगर मैं नीचे करने के लिए (प्रथम लाइनों दिखाई नहीं अब और) स्क्रॉल और फिर वापस शीर्ष पर नहीं स्क्रॉल, पहली पंक्ति की कभी कभी बटन moveup (normaly कर सकते हैं ऊपर ले जाएँ), जब तक मैं डेटा ग्रिड पर क्लिक करें, और भी दूसरे या तीसरे एक अक्षम है सक्षम होना चाहिए सक्षम है!

अगर मैं गलत पर EnableRowVirtualization निर्धारित करते हैं, मैं इस समस्या नहीं है ...

मैं केवल इंटरनेट कि इस समस्या के बारे में बात पर एक अन्य पोस्ट पाया, लेकिन वहाँ .नेट फ्रेमवर्क से डेटा ग्रिड नहीं है : http://www.infragistics.com/community/forums/t/15189.aspx

क्या आपको कोई विचार है कि मैं इसे कैसे ठीक कर सकता हूं?

अग्रिम धन्यवाद

संपादित करें: आदेश वर्ग

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 शुरू होता है? –

+0

पोस्ट 'Command' वर्ग के कोड। –

+0

CanExecute पुस्तक पर लागू नहीं किया गया है – Tan

उत्तर

4

समस्या यह है जब आप माउस व्हील के साथ स्क्रॉल करें, canExecute नहीं बुलाया जाता है।

मैं इसे ठीक करने के लिए एक AttachedProperty बनाने के लिए, और यह एक शैली में उपयोग हो सकता है।

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(); 
} 

और आप इस तरह की एक शैली में इस attachedProperty उपयोग कर सकते हैं:

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

धन्यवाद Eran Otzap मुझे दिखाने के लिए मैं क्यों इस समस्या को मिल गया है!

संबंधित मुद्दे