Обертывание функциональности UserControl в команду bindable

Пожалуйста, не мешайте себе делать выговор, если посчитаете вопрос слишком глупым. Услышь меня, пожалуйста:

  1. У меня есть пользовательский элемент управления, в котором я могу добавить столько свойств зависимостей, сколько захочу.
  2. Элемент управления в основном представляет собой элемент управления рендерингом данных (я назову его MyControl).
  3. MyControl обладает функциональностью (метод чтения), которая позволяет ему сохранять данные, которые он отображает, на диске.

Хорошо, теперь это то, что я хочу:

я хочу DependencyProperty в MyControl называется ExportDataProperty это обернет эту функциональность для кнопки в xaml для привязки к ней. Вот некоторый грубый код, чтобы объяснить это:

public class MyControl:Control
{

    /// <summary>
    /// <see cref="DependencyProperty"/> for the command that is fired to export the data
    /// </summary>
    public static readonly DependencyProperty ExportDataProperty = DependencyProperty.Register("ExportData", typeof(ICommand), typeof(MyControl), new UIPropertyMetadata(null));

    /// <summary>
    /// Gets or sets the instance of <see cref="ICommand"/> that executes the functionality of exporting.
    /// Please note that this is a synchronous call. It is advised NOT to call this for very big datasets.
    /// </summary>
    public ICommand ExportData
    {
        get { return GetValue(ExportDataProperty) as RoutedCommand; }
        set { SetValue(ExportDataProperty, value); }
    }

    /// <summary>
    /// How do I involve myself with the above command??
    /// how, How, HOw, HOW??
    /// </summary>
    private void ExportMethod()
    {
       string filename = GetFilenameByMagic();
       //Blah blah code to save at filename location.
    }

    private string GetFilenameByMagic()
    {
         return Magic.ReturnFilename();
    }    
}

Как я хочу использовать это?

<Window x:Name="AVeryBigWindow">
  <Window.Resources>
    <ResourceDictionary Source = "pack://application:,,,/FoolsFactory; component/Resources/FunnyColors.xaml"/>
  <Window.Resources>
  <StackPanel>
     <Button Command={Binding ExportData ElementName=myFunnyControl} Content="Click to Export"/>
     <controls:MyControl x:Name="myFunnyControl"/>
  </StackPanel>
</Window >

Я не уверен, как обернуть ExportMethod внутри команды?

У меня есть еще одно беспокойство: что если потребитель MyControl связывает ExportDataProperty для ICommand подвергается ViewModel? Я не хочу, чтобы это произошло.

Я подхожу к этому неправильно? Любая помощь будет оценена.

1 ответ

Решение

Вы можете установить команду изнутри элемента управления, а затем использовать ее с помощью кнопки через привязку.

CS

public class MyControl:Control
{
    ...
    public MyControl() 
    {
        ExportData = new DelegateCommand(ExportMethod);
    }

    private void ExportMethod()
    {
       string filename = GetFilenameByMagic();
       //Blah blah code to save at filename location.
    }
    ...
}

XAML

<local:MyControl x:Name="myControl" />
<Button Command="{Binding ElementName=myControl, Path=ExportData" />
Другие вопросы по тегам