0

したがって、最下層にチェックボックスを持つ階層型データ テンプレートを持つ TreeView があります。これらの 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はタイプsrc:OrderAttributeに対して定義されたHierarchicalDataTemplate内にあるため、そこにあるすべてのバインディングはそのタイプのプロパティを検索します。第3に、PropertyChangedイベントを呼び出す文字列パラメーターはわかりませんが、UIがバインドされているクラス内のCLRプロパティの名前である必要があります。複雑な階層プレゼンテーションレイヤーを実行する前に、このWPFチュートリアル を参照して、少なくとも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 に答える