0

所以我有一个 TreeView,它具有层次结构的数据模板,在最低层有 CheckBoxes。这些 CheckBox 绑定到 ViewModel 中的“isChecked”布尔值。我一直在尝试做的是加载各种变量,向我指示要检查哪些复选框,将模型中的布尔值 isChecked 更改为 true,从而导致 TreeView 中的特定 CheckBoxes 在视觉上更新。这是我的参考代码:

XAML:(我正在使用的 TreeView)

<DockPanel Name="test1" Margin="10,10,0,10" VerticalAlignment="Stretch" Grid.Row="3" Grid.RowSpan="7" Grid.Column="0">
        <DockPanel.Resources>
            <local:CheckBoxCommand x:Key="cbc"></local:CheckBoxCommand>
            <src:TreeViewFilter x:Key="MyList" />

            <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}">
                <TextBlock Text="{Binding Path=NameAndCount}" FontSize="24"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}">
                <StackPanel Name="test" Orientation="Horizontal" VerticalAlignment="Center">
                    <CheckBox Command="{StaticResource cbc}"
                              CommandParameter="{Binding Path=NameAndParent}" Visibility="{Binding Path=CheckBoxVisible}" IsChecked="{Binding Path=isChecked, Mode=TwoWay}" VerticalAlignment="Center">
                    </CheckBox>
                    <TextBlock Text="{Binding Path=NameAndCount}" FontSize="16"/>
                    </StackPanel>
            </HierarchicalDataTemplate>

        </DockPanel.Resources>
        <TreeView Name="treeView1" BorderThickness="2" ItemsSource="{Binding Source={StaticResource MyList}, UpdateSourceTrigger=PropertyChanged}" TreeViewItem.Selected="filterByBatchStatus"/>
    </DockPanel>

ViewModel 中的 C# 代码(与问题有关):

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

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

让我难过的部分是,如果我进行多次加载,一遍又一遍地更改布尔值,而不展开树并视觉看到框,然后展开树,则检查正确的框。只要我可以直观地展开并看到复选框,任何帖子加载都不会更新复选框,无论我是否展开或取消展开树。

4

1 回答 1

2

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

编辑:从 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);
}
于 2012-10-31T18:27:24.407 回答