IsEnabled绑定更新后按钮未启用

Fir*_*ren 0 c# wpf binding button

我有一堂课叫做Document

public class Document : INotifyPropertyChanged
{                  
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }             

    private string oldId;
    public string OldId
    {
        get { return oldId; }
        set { id = value; }
    }

    private string id;
    public string Id
    {
        get { return id; }
        set { 
            id = value;
            NotifyPropertyChanged("HasChanged");
        }
    }

    private string path;
    public string Path
    {
        get { return path; }
        set { path = value; }
    }

    public bool HasChanged
    {
        get { return id != oldId; }
    }

    public Document(string id, string path)
    {
        this.id = id;
        this.oldId = id;
        this.path = path;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的WPF代码后面有一个文档列表,items是窗体中的ItemsControl。

AddItem("a", "b");
AddItem("b", "b");
AddItem("c", "b");
AddItem("d", "b");
Run Code Online (Sandbox Code Playgroud)

...

private void AddItem(string key, string value)
{
    items.Items.Add(new Document(key, value));
}
Run Code Online (Sandbox Code Playgroud)

我的WPF如下所示:

<ItemsControl x:Name="items" AlternationCount="100">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="8*"/>
                    <ColumnDefinition Width="auto"/>
                </Grid.ColumnDefinitions>

                <TextBox 
                    Text="{Binding Id}"

                    PreviewKeyDown="TextBox_PreviewKeyDown"></TextBox>
                <Button 
                    Grid.Column="1" 

                    IsEnabled="{Binding HasChanged}"
                    Content="Ok"

                    Click="ButtonOk_Click"></Button>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

如您所料,当tb中的文本与原始文本发生变化时,我想启用Button。

都好

问题是在我更改了其中一个文本框的文本后,该按钮无法启用。

编辑后,请注意该按钮仍处于禁用状态

如果单击该按钮,它将变为启用状态。

首次点击后,按钮会更新

如果再次单击它,它将执行OnClick。

第二次单击后,OnClick执行

按键上的按钮更新了什么?

请记住,我使用ItemControl即时生成按钮,因此无法通过代码隐藏名称对其进行更新。

我不使用ViewModel,也不想添加一个,因为这个项目很小,无法使用任何基于ViewModel的设计模式。

alm*_*ulo 5

您遇到的原因可能是因为TextBoxes的默认Binding Text属性具有UpdateSourceTrigger=LostFocus

这意味着,Id直到TextBox失去键盘焦点(单击禁用按钮时),才可以更新您的媒体资源。也许,如果您单击另一个TextBox,则该按钮将被启用为相同。

您可以在XAML中更改此行为,如下所示:

<TextBox Text="{Binding Id, UpdateSourceTrigger=PropertyChanged}"
         PreviewKeyDown="TextBox_PreviewKeyDown"></TextBox>
Run Code Online (Sandbox Code Playgroud)