2015-06-17 7 views
0

Я в настоящее время изо всех сил пытаюсь заставить что-то работать, что в моей голове, похоже, не так уж и тяжело.Command Binding to UserControl

Получил TopLevel пользовательский элемент управления, который отображается в окне:

<UserControl.Resources> 

    <DataTemplate DataType="{x:Type viewModels:PCodeViewModel}"> 
     <controls:PCodeTabControl /> 
    </DataTemplate> 
    <DataTemplate x:Key="TabItemHeaderTemplate"> 
     <TextBlock FontWeight="Medium" Text="{Binding}" /> 
    </DataTemplate> 
    <Style x:Key="TabItemStyle" TargetType="{x:Type dx:DXTabItem}"> 
     <Setter Property="Header" Value="{Binding TabHeader}" /> 
     <Setter Property="Content" Value="{Binding}" /> 
    </Style> 
    <DataTemplate DataType="{x:Type viewModels:MexCompileViewModel}"> 
     <controls:MexCompileTabControl /> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <dx:DXTabControl ItemContainerStyle="{StaticResource TabItemStyle}" 
        ItemHeaderTemplate="{StaticResource TabItemHeaderTemplate}" 
        ItemsSource="{Binding Tabs}" /> 
</Grid> 

Соответствующий ViewModel здесь:

private ICommand createNewProjectCommand; 

    private string sandboxRoot; 

    public MatlabBuildViewModel() 
    { 
     this.Init(); 
    } 

    public void Init() 
    { 
     this.InitTabs(); 
    } 

    public void InitTabs() 
    { 
     this.Tabs = new ObservableCollection<TabViewModelBase> 
         { 
          new MexCompileViewModel(), 
          new PCodeViewModel() 
         }; 
     this.SandboxRoot = @"E:\_SupportTools\CaseManager"; 
    } 

    public ObservableCollection<TabViewModelBase> Tabs { get; private set; } 

    public void NotifyChildren() 
    { 
     Messenger.Default.Send(new SandboxRootUpdated()); 
    } 

    public string SandboxRoot 
    { 
     get 
     { 
      return this.sandboxRoot; 
     } 

     set 
     { 
      if (value != null) 
      { 
       this.sandboxRoot = value; 
       this.OnPropertyChanged(); 
       this.NotifyChildren(); 
      } 
     } 
    } 

    /// <summary> 
    /// Gets the create new project command. 
    /// </summary> 
    public ICommand CreateEmptyProjectCommand 
    { 
     get 
     { 
      if (this.createNewProjectCommand == null) 
      { 
       this.createNewProjectCommand = new DelegateCommand(Debugger.Break); 
      } 

      return this.createNewProjectCommand; 
     } 
    } 

Теперь, как вы можете видеть, я отображая две вкладки, имеющие DataTemplate для targetType MexCompileViewModel и PCodeViewModel.

Оба пользовательских элемента управления, привязанные к Dattemplate, совместно используют общий UserControl, который содержит несколько кнопок.

Вот в MexCompileTabControl в качестве примера

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <compositeControls:MexCompileGrid Grid.Column="0" IsEnabled="{Binding IsEnabled}" /> 
    <StackPanel Grid.Column="1"> 
     <compositeControls:CommonActionsControl /> 
    </StackPanel> 
</Grid> 

CommonActionsControl просто StackPanel с кнопками:

<StackPanel helpers:MarginSetter.Margin="3"> 
    <GroupBox Header="MatlabProject-File"> 
     <StackPanel helpers:MarginSetter.Margin="3"> 
      <Button Command="{Binding CreateEmptyProjectCommand}" Content="Create empty project-file" /> 
      <Button Content="Refresh" /> 
     </StackPanel> 
    </GroupBox> 
    <GroupBox Header="Actions"> 
     <StackPanel helpers:MarginSetter.Margin="3"> 
      <Button Content="Clean" /> 
      <Button Content="Rebuild" /> 
      <Button Content="Generate m-Script" /> 
     </StackPanel> 
    </GroupBox> 
</StackPanel> 

Код За:

 public CommonActionsControl() 
    { 
     this.InitializeComponent(); 
    } 

    public static readonly DependencyProperty CreateEmptyProjectCommandProperty = DependencyProperty.Register("CreateEmptyProjectCommand", typeof(ICommand), typeof(CommonActionsControl), new PropertyMetadata(default(ICommand))); 

    public ICommand CreateEmptyProjectCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(CreateEmptyProjectCommandProperty); 
     } 

     set 
     { 
      this.SetValue(CreateEmptyProjectCommandProperty, value); 
     } 
    } 

Так что я пытаюсь достичь это: Мои команды определены в TopLevelViewModel. Теперь я хочу, чтобы мои CommonActionsControl наследовали эти Команды, так как элемент управления должен использоваться несколько раз. ты можешь помочь мне с этим?

ответ

0

С CommonActionsControl отображает общие действия, определенные в TopLevelViewModel. Было бы разумно иметь их как часть TopLevelView вместо отображения их на каждой вкладке.

Если вы действительно хотите их на каждой вкладке, я бы сказал, что лучше всего добавить команды в ваш TabViewModelBase, чтобы различные виды таблеток могли привязываться к ним. Вы по-прежнему можете реализовать их один раз в TopLevelViewModel и просто передать их в различные вкладки VM, вставив их в конструктор.