绑定变量不使用InotifyPropertychanged和设置DataContext更新



我正在编写一个简单的宏程序程序,您可以在此过程中和这样做来创建宏,我想创建一个新的宏观编辑器的用户控件。每个宏编辑器都有两个文本框。左一个是您需要按的键,右文本框显示在按下第一个键后将输出的键。我对这两个文本框使用了绑定,但似乎没有更新。它仅显示开始值。

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设置为PropertyChangedTextBox.Text默认使用LostFocus(文本框失去焦点时更新(。

设置Text时,您的属性更改的事件将在触发。

text[0] = "test";

这不会调用Text的设置器。您将需要以Text =开头的线。也就是说,更好的方法是实际拥有两个属性,每个字段为每个字段。拥有数组没有优势。

最新更新