从XAML调用位于类中的事件或方法

时间:2011-04-22 23:50:40

标签: wpf styles styling resourcedictionary

嗨,我正在尝试,如果可能有像TextChanged(TextBox)这样的事件位于另一个独立于Window CodeBehind的地方(像一个类)。

我想要做的是在ResourceDictionary中引用TextBox的事件。 (因为ResourcesDictionaries没有CodeBehind。)

注意:它必须通过这种方式,因为我正在自定义另一个控件以动态地拥有一些TextBox,并且当TextChanged发生时,所有TextBox都将触发相同的事件。

2 个答案:

答案 0 :(得分:2)

我会建议触发器。您可以在此处详细了解它们:http://www.silverlightshow.net/items/Behaviors-and-Triggers-in-Silverlight-3.aspx

基本上你可以在xaml中将一个控件的事件挂钩到一个触发器并让它执行一个方法或命令else where。

编辑:我应该注意,虽然它确实说'Silverlight',但它也适用于WPF。 Edit2:MVVM工具包提供了一个EventToCommandTrigger,可以让你做这样的事情:

http://blog.galasoft.ch/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand-behavior.aspx

感谢H.B.回答提醒我这样做的命令方式

Edit3:更好的例子,这很大程度上借鉴了MVVM世界将如何做到这一点。由于EventToCommand绑定将附加到控件的上下文中,因此您可以将其粘贴在ResourceDictionary中以及放置它的任何位置,它将尝试查找TextChangeCommand属性。

 <Window x:Class="TestBed.TestWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras">
    <Grid>
        <TextBox x:Name = "MyTextBox">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <cmd:EventToCommand Command="{Binding TextChanged, Mode=OneWay}"
                                        CommandParameter="{Binding Text, 
                                              ElementName=MyTextBox, Mode=OneWay}"
                        MustToggleIsEnabledValue="True" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox>
    </Grid>
</Window>

和代码隐藏:

public partial class TestWindow : Window
{
    public TestWindow()
    {
        this.TextChangedCommand = new RelayCommand<string>(
            (str) => TextChanged(str));

        InitializeComponent();
    }

    public RelayCommand<string> TextChangedCommand
    {
        get;
        private set;
    }

    public void TextChanged(string str)
    {
    }
}

答案 1 :(得分:0)

编辑:除非您想将TextBox子类化为在TextChanged上执行命令,否则请忽略此项。 (我认为首选触发方法。)

  

但是可以参考   ResourceDictionaries到事件   位于CodeBehind的   控件所属的窗口?   想象一下,而不是我们   将事件设置为控件   XAML,我们在字典中这样做   一种风格。那可能吗?

我建议Commands为此;在某处定义RoutedCommand:

public static class Commands
{
    public static RoutedCommand DoStuff = new RoutedCommand();
}

将其设置为字典中的按钮:

<Button x:Key="TheButton" Content="Click"
        Command="{x:Static local:Commands.DoStuff}" />

并创建一个命令绑定:

<Grid>
    <Grid.CommandBindings>
        <CommandBinding Command="{x:Static local:Commands.DoStuff}"
                        Executed="DoStuff_Executed"
                        CanExecute="DoStuff_CanExecute"/>
    </Grid.CommandBindings>
    <StaticResource ResourceKey="TheButton"/>
</Grid>
private void DoStuff_Executed(object sender, ExecutedRoutedEventArgs e)
{
    // What happens if the command is executed, in this case the Button-click can
    // cause this to happen, you can also create KeyBindings which can execute
    // commands for example.
    MessageBox.Show("!");
}
private void DoStuff_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true; //No condition: Command can always be executed

    // e.CanExecute = false causes the button to be disabled.
}