Caliburn Micro Передача DataGrid как проблема параметров - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в Caliburn Micro, пытаюсь экспортировать DataGrid в Excel, передав DataGrid в качестве параметра команде

Переданный аргумент методу всегда равен нулю, поэтому я получаю исключение нуля

Вот код XAML:

<DataGrid x:Name="grdPeople" ItemsSource="{Binding Path=People}"/>
<Button cal:Message.Attach="[Event Click] = [Action btnExportToExcel(grdPeople)]"  /> 

мой ViewModel:

public class ShellViewModel : PropertyChangedBase
{
    private ObservableCollection<Person> people;

    public ObservableCollection<Person> People
    {
        get { return people; }
        set
        {
            people = value;
            NotifyOfPropertyChange(() => People);
        }
    }


    public ShellViewModel()
    {
        People = new ObservableCollection<Person>();
        people.Add(new Person { FirstName = "Zico", LastName = "Ayoub" });
        people.Add(new Person { FirstName = "Fibi", LastName = "Victor" });
        people.Add(new Person { FirstName = "Matthew", LastName = "Zakaria" });
        people.Add(new Person { FirstName = "Marco", LastName = "Zakaria" });

    }

    public void btnExportToExcel(DataGrid dg)
    {


        string fileName = @"d:\myfile.csv";

        dg.SelectAllCells(); // Error Here  (Object reference not set to an instance of an object)
        dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        ApplicationCommands.Copy.Execute(null, dg);
        String resultat = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
        String result = (string)Clipboard.GetData(DataFormats.Text);
        dg.UnselectAllCells();
        System.IO.StreamWriter file1 = new System.IO.StreamWriter(fileName);
        file1.WriteLine(result);
        file1.Close();

    }

}

Я ожидаю, что будет получен экземпляр DataGrid, но я получил нулевой DataGrid

1 Ответ

0 голосов
/ 12 февраля 2019

Если вы действительно хотите передать ссылку на элемент в модель представления, вы можете использовать длинный синтаксис:

<Button xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <cal:ActionMessage MethodName="btnExportToExcel">
                <cal:Parameter Value="{Binding ElementName=grdPeople}" />
            </cal:ActionMessage>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Но модель представления не должна ссылаться на DataGrid, если выследуйте шаблону проектирования MVVM.

...