2010-10-19 2 views
0

Есть ли способ вызова методов внешних объектов (например, объектов ресурсов) непосредственно из xaml?Есть ли способ вызова внешних функций из 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, а не код.

ответ

1

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

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); 
    } 
} 

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

1

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

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

+0

Это напомнило мне хорошее направление. Благодарим вас за помощь и ознакомьтесь с моим окончательным решением. – Gal