0

私のWPFアプリケーションでは、MVVMパターンを使用しています。私のビューには、以下に定義されているように、オブジェクトのobservableCollectionをバインドするツリービューがあります。私がやりたいのは、バインドされたオブジェクトがダーティプロパティをtrueに設定したときに、ツリーアイテム名の色を変更することです。最初にツリーにデータを入力したときに色を設定できますが、プロパティがfalseとtrueの間で変更されたときに変更が反映されません。

public class HierarchicalItem
{
    private readonly ObservableCollection<HierarchicalItem> _children = new ObservableCollection<HierarchicalItem>();

    public ViewModelBase ViewModel { get; set; }

    public string Name
    {
        get { return ViewModel.ViewModelName; }
    }

    public ICollection<HierarchicalItem> Children
    {
        get { return _children; }
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            if (_isSelected)
                EventSystem.Publish(new SelectedViewModelMessage { SelectedViewModel = ViewModel });
        }
    }

    public bool IsDirty
    {
        get { return ViewModel.IsDirty; }
    }
}

これはツリービューxamlです:

    <TreeView Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=Views}">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="True"/>
                <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=OneWayToSource}" />
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.Resources>

            <HierarchicalDataTemplate DataType="{x:Type local:HierarchicalItem}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}">

                    <TextBlock.Style>
                        <Style TargetType="TextBlock">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsDirty}" Value="True">
                                    <Setter Property="Foreground" Value="Red" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>

                </TextBlock>
            </HierarchicalDataTemplate>

        </TreeView.Resources>
    </TreeView>

ツリーにバインドされるコレクションは次のとおりです。

    private readonly ObservableCollection<HierarchicalItem> _views = new ObservableCollection<HierarchicalItem>();
    public ObservableCollection<HierarchicalItem> Views
    {
        get { return _views; }
    }

HierarchicalItemコレクションで参照されるViewModelはすべて、「IsDirty」プロパティを公開する基本クラスから派生します。これは明らかに状態を変化させているので、コーディングを間違えたのか、それとも私が達成したいことがこの方法で実行できないのかはわかりません。クラスはすべて「INotifyPropertyChanged」インターフェースを使用します。ViewModel基本クラスの「IsDirty」プロパティは次のとおりです。

public class ViewModelBase : ValidatableModel
{
    #region Properties

    private bool _isDirty;
    public bool IsDirty
    {
        get { return _isDirty; }
        protected set
        {
            _isDirty = value;
            OnPropertyChanged("IsDirty");
        }
    }

 .
 .
 .
 Etc
4

1 に答える 1

1

これは、HierarchicalItem(問題が発生しているもの)がIsDirtyプロパティに完全なINPCアプローチを使用していないためです。ビューモデルはこれを行いますが、DataTemplateはHierarchicalItemのIsDirtyプロパティを使用するため、これだけでは不十分です。そのため、完全なINPCプロパティも必要です。

これに変更しました。問題ないはずです。

private bool _isDirty;
public bool IsDirty
{
    get { return _isDirty; }
    protected set
    {
        _isDirty = value;
        OnPropertyChanged("IsDirty");
    }
}

ただし、ユースケースでは、それを実行する方法を見つける必要があります。または、HierarchicalItemDataTemplateのバインディングをこれに変更することもできます。

<DataTrigger Binding="{Binding ViewModel.IsDirty}" Value="True">
于 2013-03-27T09:20:34.147 に答える