Есть ли способ вызвать внешние функции из xaml? - PullRequest
0 голосов
/ 19 октября 2010

Есть ли способ вызывать методы внешних объектов (например, объектов ресурсов) напрямую из xaml?

Я имею в виду что-то вроде этого:

<Grid xmlns:dm="clr-namespace:MyNameSpace;assembly=MyAssembly">
    <Grid.Resources>
      <dm:TimeSource x:Key="timesource1"/>
    </Grid.Resources>

    <Button Click="timesource_updade">Update time</Button>
</Grid>

Метод timesource_update, разумеется, является методом объекта TimeSource.

Мне нужно использовать чистый XAML, а не какой-либо код позади.

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

ОК, вот окончательное решение.

XAML:

    <Grid xmlns:dm="clr-namespace:MyNameSpace;assembly=MyAssembly">
        <Grid.Resources>
          <dm:TimeSource x:Key="timesource1"/>
        </Grid.Resources>

        <Button Command="{x:Static dm:TimeSource.Update}" 
                CommandParameter="any_parameter" 
                CommandTarget="{Binding Source={StaticResource timesource1}}">Update time</Button>
    </Grid>

КОД в классе TimeSource:

public class TimeSource : System.Windows.UIElement {

  public static RoutedCommand Update = new RoutedCommand();

  private void UpdateExecuted(object sender, ExecutedRoutedEventArgs e)
  {
      // code
  }

  private void UpdateCanExecute(object sender, CanExecuteRoutedEventArgs e)
  {
      e.CanExecute = true;
  }

  // Constructor
  public TimeSource() {

    CommandBinding cb = new CommandBinding(TimeSource.Update, UpdateExecuted, UpdateCanExecute);
    CommandBindings.Add(cb2);
  }
}

Источник времени должен быть получен из UIElementдля того, чтобы иметь CommandBindings.Но в результате вызывается метод внешней сборки непосредственно из XAML.При нажатии на кнопку вызывается метод UpdateExecuted объекта timesource1, и это именно то, что я искал.

3 голосов
/ 19 октября 2010

Проверьте этот поток , у него похожая проблема.В общем случае вы не можете вызывать метод напрямую из xaml.Вы можете использовать команды или создать объект из xaml, который создаст метод в потоке, который будет располагать себя, когда это необходимо.

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

...