我正在编写一个简单的宏程序程序,您可以在此过程中和这样做来创建宏,我想创建一个新的宏观编辑器的用户控件。每个宏编辑器都有两个文本框。左一个是您需要按的键,右文本框显示在按下第一个键后将输出的键。我对这两个文本框使用了绑定,但似乎没有更新。它仅显示开始值。
c#:
public MacroControl()
{
InitializeComponent();
DataContext = this;
Thread checkKeys = new Thread(new ThreadStart(CheckKeys));
checkKeys.Start();
}
private string[] _text = {null,null};
public string[] Text
{
get { return _text; }
set
{
if(_text != value)
{
_text = value;
NotifyPropertyChanged();
}
}
}
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
TextBoxIndex = 0;
Text[TextBoxIndex] = "test";
}
private void TextBox_GotFocus_1(object sender, RoutedEventArgs e)
{
TextBoxIndex = 1;
Text[TextBoxIndex] = "test";
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
xaml:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250*"/>
<ColumnDefinition Width="141*"/>
<ColumnDefinition Width="109*"/>
</Grid.ColumnDefinitions>
<TextBlock FontSize="20" HorizontalAlignment="Center" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="236,12,126.625,11">⟶</TextBlock>
<TextBox IsReadOnly="True" Text="{Binding Text[0]}" GotFocus="TextBox_GotFocus" Background="Transparent" Margin="15" Grid.Column="0"/>
<TextBox IsReadOnly="True" Text="{Binding Text[1]}" GotFocus="TextBox_GotFocus_1" Background="Transparent" Margin="15" Grid.Column="1" Grid.ColumnSpan="2"/>
正如我在评论中提到的那样,数组不会发射 PropertyChanged
事件,因此您的绑定甚至不知道您更改了值。更改项目后,潜在的解决方法是手动称其为手动:
TextBoxIndex = 0;
Text[TextBoxIndex] = "test";
NotifyPropertyChanged("Text[]");
是的,[]
是有意的。
更好的方法是使用两个单独的属性。
略有相关:如果您希望在用户仍输入文本时更新您的属性,请将绑定的UpdateSourceTrigger
设置为PropertyChanged
。TextBox.Text
默认使用LostFocus
(文本框失去焦点时更新(。
设置Text
时,您的属性更改的事件将在触发。
text[0] = "test";
这不会调用Text
的设置器。您将需要以Text =
开头的线。也就是说,更好的方法是实际拥有两个属性,每个字段为每个字段。拥有数组没有优势。