嗨,我正在尝试,如果可能有像TextChanged(TextBox)这样的事件位于另一个独立于Window CodeBehind的地方(像一个类)。
我想要做的是在ResourceDictionary中引用TextBox的事件。 (因为ResourcesDictionaries没有CodeBehind。)
注意:它必须通过这种方式,因为我正在自定义另一个控件以动态地拥有一些TextBox,并且当TextChanged发生时,所有TextBox都将触发相同的事件。
答案 0 :(得分:2)
我会建议触发器。您可以在此处详细了解它们:http://www.silverlightshow.net/items/Behaviors-and-Triggers-in-Silverlight-3.aspx
基本上你可以在xaml中将一个控件的事件挂钩到一个触发器并让它执行一个方法或命令else where。
编辑:我应该注意,虽然它确实说'Silverlight',但它也适用于WPF。 Edit2:MVVM工具包提供了一个EventToCommandTrigger,可以让你做这样的事情:
感谢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.
}