none
Как получить контрол из ViewModel? RRS feed

  • Вопрос

  • Доброго дня!

    Я застрял :( Собственно использую PRISM

     

    Я хочу распечатать график. Нажимаю на кнопку "Печать". Команда хитрым способом маршрутизируется из RibbonModule в SkladModule. В SkladModule(а конкретно во ViewModel) происходит обработка этой команды. Мне собственно нужно в этом обработчике получить мой Chart(а не его свойства). В варианте без PRISM(только MVVM) я использовал CommandParametr = "{Binding ElementName = chart1}".  А здесь это не канает.

    Есть ли способ осуществить желаемое???

    13 августа 2013 г. 5:18

Ответы

  • А-а... ну коль вам в любом случае нужен этот чарт в коде, то можно его сделать как свойство ViewModel и привязать к ContentControl (все в SkladModule):

    ViewModel.cs

    public Chart MyChart { get; private set; }

    View.xaml

    <ContentControl Content="{Binding MyChart}"/>

    При этом вам не надо передавать чарт в качестве параметра во ViewModel, он уже там будет и так.

    13 августа 2013 г. 7:49

Все ответы

  • А для чего вам сам элемент управления?
    13 августа 2013 г. 6:47
  • Чтобы отскринить его, вставить в отчет и распечатать

    Telerik.Windows.Controls.RadCartesianChart rt = (Telerik.Windows.Controls.RadCartesianChart)МОЙ_Контрол;
                 var renderTargetBitmap = new RenderTargetBitmap((int)rt.ActualWidth, (int)rt.ActualHeight,
                         96, 96, PixelFormats.Pbgra32);
                 renderTargetBitmap.Render((Visual)v); 
    
                 PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
                 // puch rendered bitmap into it
                 pngEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
                 var fileName = string.Format(@"{0}\Screenshot.jpg", Path.GetTempPath());
                 if (File.Exists(fileName))
                     File.Delete(fileName);
                 var fileStream = new FileStream(fileName, FileMode.CreateNew);
                 pngEncoder.Save(fileStream);
                 fileStream.Close();
    
                 System.Drawing.Image img = System.Drawing.Image.FromFile(fileName);
                 string base64 = ConvertImageToBase64(img, ImageFormat.Png);

    13 августа 2013 г. 7:03
  • Попробуйте обернуть Chart в ContentControl и привязывайтесь к свойству Content:

    <ContentControl x:Name="content">

    <Chart/>

    </ContentControl>

    CommandParametr = "{Binding Content, ElementName = content}"

    Это так, навскидку.

    13 августа 2013 г. 7:12
  • В том то и проблема chart и CommandParametr  находятся в разных View
    13 августа 2013 г. 7:41
  • А-а... ну коль вам в любом случае нужен этот чарт в коде, то можно его сделать как свойство ViewModel и привязать к ContentControl (все в SkladModule):

    ViewModel.cs

    public Chart MyChart { get; private set; }

    View.xaml

    <ContentControl Content="{Binding MyChart}"/>

    При этом вам не надо передавать чарт в качестве параметра во ViewModel, он уже там будет и так.

    13 августа 2013 г. 7:49
  • Видимо это единственно верный способ, хотя и не совсем удобно создавать и настраивать chart в коде.

    Спасибо за помощь!

    13 августа 2013 г. 9:24