将布尔值绑定到IsEnabled

本文关键字:IsEnabled 绑定 布尔值 | 更新日期: 2023-09-27 18:12:41

编辑:

我像ASh建议的那样添加了INotifyPropertyChanged,但它仍然不能100%工作,但我会在另一个问题中问这个问题。

我意识到我弄错了HasChanged,并将其更改为!=

更新的原始帖子

我有一门课叫文档

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;
    }
}

我在WPF代码后面得到了文档列表是我表单中的ItemsControl。

AddItem("a", "b");
AddItem("b", "b");
AddItem("c", "b");
AddItem("d", "b");

private void AddItem(string key, string value)
{
    items.Items.Add(new Document(key, value));
}

我的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>

正如您所猜测的,当tb中的文本与原始文本发生更改时,我希望启用Button。

问题是IsEnabled上的绑定不起作用。

需要做些什么才能让它发挥作用?

或者,有没有更好的方法可以在更改后启用按钮,请记住,我不能从后面的代码直接访问按钮,因为ItemControl正在根据我的模板动态生成按钮。

我不想使用ViewModel,因为这个应用程序很小,不会从中获利。

将布尔值绑定到IsEnabled

如果在Document中实现INotifyPropertyChanged,并在HasChanged更改时引发PropertyChanged事件(在Id setter中(,则IsEnabled的绑定应更新