मैं इसे एक साधारण स्तर पर परीक्षण करने की कोशिश कर रहा हूं जहां मेरे पास निम्न कार्यडेटाग्रिड व्यू.एक्सएमएल है:

<UserControl x:Class="Example.Views.TasksDatagridView" ...>
    <UserControl.Resources>
        <local:CompleteConverter x:Key="completeConverter" />
        <local:Tasks x:Key="tasks" />
        <CollectionViewSource x:Key="cvsTasks" Source="{Binding Path=tasks}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="ProjectName"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </UserControl.Resources>
    <Grid>
        <DataGrid x:Name="myDG" AutoGenerateColumns="True" ItemsSource="{Binding Source={StaticResource cvsTasks}}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="AutoGeneratingColumn">
                    <i:InvokeCommandAction Command="{Binding GenColumns}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </DataGrid>
    </Grid>
</UserControl>

मेरे TasksDatagridView.xaml.cs में मैंने पहले डेटाकॉन्टेक्स्ट सेट करने की कोशिश की this.DataContext = new ViewModels.TaskDgVm() और फिर InitializeComponent() और इसके विपरीत।

मेरी मुख्य विंडो MainWindow.xaml में मैं इस तरह के नियंत्रण का संदर्भ देता हूं:

<Window x:Name="MainWindow" x:Class="Example.Views.MyMainWindowView" ...>
  <Grid>
    <local:TasksDatagridView x:Name="tview" />
  </Grid>
</Window>

यह एक व्युत्पन्न उदाहरण है जो बिंदु दिखाता है इसलिए कृपया गलत वर्तनी का बहाना करें। तो मेरे पास दो मुद्दे हैं:

  1. MainWindow.xaml लाइन में जहां मैं नियंत्रण का संदर्भ देता हूं: <local:TasksDatagridView x:Name="tview" /> यह कहता है कि इसने एक सिस्टम फेंक दिया। अपवाद, फिर भी कोड अभी भी संकलित और ठीक चलता है।

  2. AutoGeneratingColumn को सक्रिय नहीं किया जा रहा है।

वास्तव में मैं # 2 का पता लगाने की कोशिश कर रहा हूं और यह विशिष्ट घटना फायरिंग क्यों नहीं कर रही है। अभी मेरे पास निष्पादन विधि में एक साधारण प्रिंट है और डेटाग्रिड के लिए एक साधारण क्लिक या लोड किए गए ईवेंट के साथ ईवेंट नाम को प्रतिस्थापित करते समय कमांड ठीक काम करता है और बस किसी भी अन्य ईवेंट को निकाल दिया जाता है, जो मुझे बताता है कि यह मेरे व्यूमोडेल में कुछ नहीं है या प्रतिनिधि कमांड वर्ग। ऑटोजेनरेट कॉलम इवेंट कमांड के साथ काम क्यों नहीं कर रहा है, इस पर कोई विचार? नोट मैंने सुनिश्चित किया है कि ईवेंट का नाम गलत वर्तनी वाला नहीं है।

संपादित करें: प्रश्न पोस्ट करने के बाद मुझे यहां एक संबंधित प्रश्न मिला: MVVM - WPF DataGrid - AutoGeneratingColumn Event हालाँकि वे mvvm-light टूलकिट का उपयोग करते हैं जहाँ मैं अभिव्यक्ति मिश्रण अन्तरक्रियाशीलता पुस्तकालय का उपयोग कर रहा हूँ। हालांकि एक ही उत्तर दोनों प्रश्नों पर लागू हो सकता है, वे वास्तव में दो अलग टूलकिट हैं।

0
arias_JC 15 अक्टूबर 2018, 21:08

1 उत्तर

सबसे बढ़िया उत्तर

तो इस धागे पर आधारित MVVM - WPF DataGrid - AutoGeneratingColumn Event मेरा मानना ​​है कि विजुअल ट्री है इनमें से कुछ घटनाओं के दौरान निर्माण नहीं हो रहा है।

लेकिन एक विकल्प प्रदान किया गया है जो पीछे कोड से बचते हुए समस्या का समाधान करता है:

public class AutoGeneratingColumnEventToCommandBehaviour
{
    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached(
            "Command", 
            typeof(ICommand), 
            typeof(AutoGeneratingColumnEventToCommandBehaviour),
            new PropertyMetadata(
                null,
                CommandPropertyChanged));

    public static void SetCommand(DependencyObject o, ICommand value)
    {
        o.SetValue(CommandProperty, value);
    }

    public static ICommand GetCommand(DependencyObject o)
    {
        return o.GetValue(CommandProperty) as ICommand;
    }

    private static void CommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var dataGrid = d as DataGrid;
        if (dataGrid != null)
        {
            if (e.OldValue != null)
            {
                dataGrid.AutoGeneratingColumn -= OnAutoGeneratingColumn;
            }
            if (e.NewValue != null)
            {
                dataGrid.AutoGeneratingColumn += OnAutoGeneratingColumn;
            }
        }
    }

    private static void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var dependencyObject = sender as DependencyObject;
        if (dependencyObject != null)
        {
            var command = dependencyObject.GetValue(CommandProperty) as ICommand;
            if (command != null && command.CanExecute(e))
            {
                command.Execute(e);
            }
        }
    }
}
0
Samuel Liew 16 अक्टूबर 2018, 15:27