如何直观地更新UI中绑定到WPF c#中的布尔isChecked变量的复选框?

如何直观地更新UI中绑定到WPF c#中的布尔isChecked变量的复选框?,c#,wpf,binding,checkbox,inotifypropertychanged,C#,Wpf,Binding,Checkbox,Inotifypropertychanged,所以我有一个树状视图,它有一个在最底层有复选框的架构数据模板。这些复选框绑定到ViewModel中的“isChecked”布尔值。我一直试图做的是加载各种变量,向我指示要检查哪些复选框,将模型中的布尔值isChecked更改为true,从而导致树视图中的特定复选框被可视化地更新。以下是我的代码供参考: XAML:(与我合作的TreeView的) 如果我加载这些值,更新布尔值,然后展开树(这样我就可以直观地看到它们),正确的复选框就会被选中,一切正常。当我在最初看到第一个加载的复选框后加载不同的复

所以我有一个树状视图,它有一个在最底层有复选框的架构数据模板。这些复选框绑定到ViewModel中的“isChecked”布尔值。我一直试图做的是加载各种变量,向我指示要检查哪些复选框,将模型中的布尔值isChecked更改为true,从而导致树视图中的特定复选框被可视化地更新。以下是我的代码供参考:

XAML:(与我合作的TreeView的)

如果我加载这些值,更新布尔值,然后展开树(这样我就可以直观地看到它们),正确的复选框就会被选中,一切正常。当我在最初看到第一个加载的复选框后加载不同的复选框时,问题就出现了,更改布尔值,然后复选框不随时间变化(根本不改变)


让我感到困惑的是,如果我执行多个加载,反复更改布尔值,而不展开树并直观地看到框,然后展开树,将选中正确的框。只要我能直观地展开并看到复选框,任何后期加载都不会更新复选框,无论我是否展开或取消展开树。

哇。。。你这里有一些严重的问题。首先,正如我在你之前的问题中所说的。其次,您的复选框位于为src:OrderAttribute类型定义的HierarchycalDataTemplate中,因此所有绑定都将搜索该类型的属性。第三,我不清楚调用PropertyChanged事件的字符串参数是什么,但它应该是类中CLR属性的名称,UI绑定到该属性。我强烈建议您在尝试执行复杂的分层表示层之前,至少先了解一下MVVM、INotifyPropertyChanged和DataTemplateing的基础知识

编辑:从OrderAttribute类中删除DependencyProperty,并使用常规bool属性,然后在调用PropertyChanged时,通过传递包含该属性名称的字符串参数来执行此操作:

public bool MyBool 
{ 
   get { return _mybool; }
   set {
         _mybool = value;
         NotifyPropertyChanged("MyBool");
       }
}

public void NotifyPropertyChanged(string propertyName)
{
   if (PropertyChanged != null)
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
}

看起来您只是在“CheckBoxChecked”上执行“FirePropertyChanged2”,而不是在“isChecked”上执行,您将其绑定到第二个点,布尔值在OrderAttribute类中。如果您查看复选框旁边的textblock,我尝试模拟相同类型的绑定,因为它适用于将textblock绑定到OrderAttribute中的数据(这是我的模型,可能是im混淆了model/viewmodel)。对于第三点,你是对的,它不是一个字符串。我尝试使用bool,但PropertyChanged()事件处理程序只包含字符串参数。至于第一点,我不知道,我在树中的TextBlock中使用了它,它工作得很好,并立即更新了UI。如果在应用程序的非可视元素(如模型或ViewModels)中定义DependencyProperties,您将遇到严重的问题。DependencyObjects具有线程关联性,这意味着您不能从创建它们的线程之外的其他线程修改它们的任何属性,如果您要将它们绑定到UI,则该线程也必须是UI线程。我尝试了您的编辑,没有依赖性属性,仍然是相同的错误。在我的示例中,propertyName是什么?只是不明白为什么当我将isChecked从false改为true,然后展开树时它会工作。但随后的任何更改都不会进行可视化更新、树扩展或其他操作。您是否阅读了我链接到的教程?当您在设置数据后展开树时,元素是正常的,因为UIElements正在创建并绑定到正确的数据,而当您更改数据且未正确更改NotifyPropertyChange时,它不会在UI中刷新。您是对的,我以为正在使用的依赖项属性甚至没有被使用。我胡乱摆弄,把它弄到手了,谢谢你的帮助
public event PropertyChangedEventHandler PropertyChanged2;

protected void FirePropertyChanged2(string CheckBoxChecked)
    {
        if (PropertyChanged2 != null)
        {
            PropertyChanged2(this, new PropertyChangedEventArgs(CheckBoxChecked));
        }
    }

public static bool cbc;

public bool CheckBoxChecked
    {
        get { return (bool)GetValue(CheckBoxCheckedProperty); }
        set { SetValue(CheckBoxCheckedProperty, value); }
    }

public static readonly DependencyProperty CheckBoxCheckedProperty =
        DependencyProperty.Register("CheckBoxChecked", typeof(bool), typeof(OrderAttribute), new UIPropertyMetadata((bool)false));

bool _isChecked;
    public bool isChecked
    {
        get { return _isChecked; }

        set
        {
            if (_isChecked != value)
            {
                _isChecked = value;
                FirePropertyChanged2("CheckBoxChecked");
            }
        }
    }
public bool MyBool 
{ 
   get { return _mybool; }
   set {
         _mybool = value;
         NotifyPropertyChanged("MyBool");
       }
}

public void NotifyPropertyChanged(string propertyName)
{
   if (PropertyChanged != null)
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
}