Как получить доступ к свойствам пользовательского элемента управления из файла ResourceDictionary - PullRequest
0 голосов
/ 02 апреля 2020

Я использую Dev Express и Prism в моем приложении, которое я новичок в обоих. Я пытаюсь получить доступ к «MyText» в элементе контента, который я создаю в моей viewmodel. В настоящее время, когда этот элемент создается в CreatedSelectionEventReceived () с помощью модели представления, я не вижу, чтобы это свойство отображалось в моем списке параметров при отладке. Я хотел бы знать, как получить доступ к этому после его создания, чтобы я мог обновлять свойство при обновлении свойства NumGaugeValue через viewmodel. Прямо сейчас я могу жестко закодировать значение для «MyText», но не могу связать его.

ResourceDictionary.xaml

<ResourceDictionary
x:Class="MyProject.WPF.Resources.CustomShapes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/charts"
xmlns:dxdiag="http://schemas.devexpress.com/winfx/2008/xaml/diagram"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxga="http://schemas.devexpress.com/winfx/2008/xaml/gauges"
xmlns:ctrl="clr-namespace:MyProject.WPF.Controls"
xmlns:vm="clr-namespace:MyProject.WPF.ViewModels">
<Style x:Key="NumGaugeContentItem" TargetType="dxdiag:DiagramContentItem">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <ctrl:NumberGauge MyText="22"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>
  </Style>
</ResourceDictionary>

MyView.xaml

<dxdiag:DiagramControl
                        x:Name="Diagram"
                        Width="{Binding ElementName=Dashboard, Path=ActualWidth}"
                        Height="{Binding ElementName=Dashboard, Path=ActualHeight}"
                        AllowAddRemoveItems="True"
                        AllowMoveItems="True"
                        AllowResizeItems="True"
                        CanvasSizeMode="Fill"
                        GridSize="25,25"
                        MaxZoomFactor="1"
                        MinZoomFactor="1"
                        ScrollMode="Content"
                        SelectedStencils="BasicShapes"
                        SelectionMode="Single"
                        ShowRulers="False"
                        ShowSelectionRectangle="False"
                        SnapToGrid="True"
                        SnapToItems="False"
                        ZoomFactor="1" />
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Drop">
                            <prism:InvokeCommandAction Command="{Binding DiagramControlDropCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type dxdiag:DiagramControl}}}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>

MyViewModel .cs

 public class MyViewModel: BindableBase
{
   public string NumGaugeValue
    {
        get { return _numGaugeValue; }
        set { SetProperty(ref _numGaugeValue, value); }
    }
   private DiagramControl DiagramCtrl { get; set; }
   private Point CtrlPlacementCoordinates { get; set; }

   public DelegateCommand<string> UpdateCommand { get; set; }
   public DelegateCommand<DragEventArgs> DiagramControlDropCommand { get; set; }

   public MyViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        UpdateCommand = new DelegateCommand<string>(Execute).ObservesProperty(() => NumGaugeValue);  
        DiagramControlDropCommand = new DelegateCommand<DragEventArgs>(HandleDropOnDxDiagram);
        ItemSelectionCommand = new DelegateCommand<object>(ProcessSelectionCommand);
        _eventAggregator.GetEvent<ControlSelectionEvent>().Subscribe(ControlSelectionEventReceived);
    }

   public MyViewModel() { }

   private DiagramContentItem CreateDiagramItem(string styleId, Point position)
    {
        var ctrlItem = new DiagramContentItem() {CustomStyleId = styleId, Position = position};
        return ctrlItem;
    }

  private void HandleDropOnDxDiagram(DragEventArgs sender)
    {
        DiagramCtrl = (DiagramControl)sender.Source;
        CtrlPlacementCoordinates = sender.GetPosition(DiagramCtrl);
    }

    private void DoDragDrop(object sender)
    {
        // Grab the control from the accordion item and store as the control that was dropped
        var item = (AccordionItem)sender;
        var controlDropped = (ControlType)item.Items[0];

        if (controlDropped.DataContext != null)
        {
            DragDrop.DoDragDrop(controlDropped, controlDropped.DataContext, DragDropEffects.Move);
        }
    }

  private void ControlSelectionEventReceived(ControlSelectionMessageInfo controlName)
    {
        // Create the control that was selected dynamically
        switch (controlName.SelectedControlName)
        {
            case "NumberGauge":
                var numGauge = CreateDiagramItem("NumGaugeContentItem", CtrlPlacementCoordinates);
                DiagramCtrl.Items.Add(numGauge);
                break;
            //other cases here but not relevant
        }
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...