1

SilverlightでTreeViewのDataTemplateを作成するための複雑な要件がいくつかあります。これはMVVMデザインパターンを使用しています。これが私が欲しいものです:

Package1 Child1 Child2 Package2 Child3 Child4

コード:

 Class Package
 {
   string _Name;
   ObservableCollection<Child> _Childs;
public ObservableCollection<Child> Childs{get{return _Childs; } set{_Childs=value;}}
public string PackageName{get{return _Name; } set{_Name=value;}}

  }

 class Child
 {
   string ChildName;
public bool IsEnabled{get;set;}
public string Id{get; set;}
  }

上記のデータコントラクトを使用して、ツリービューを作成する必要があります。パッケージ名はTreeItemヘッダー値です。各子アイテムは、コンテンツがChildNameである子ボックスであり、チェックボックスのEnabledプロパティは子のIsEnabledにバインドされています。

次のコードを試しましたが、ツリービューがまったく表示されません。

 <sdk:TreeView x:Name="SelectedPackagesTV" ItemsSource="{Binding Packages, Mode=TwoWay}"
                              ItemTemplate="{StaticResource PackageTemplate}">
                    <sdk:TreeView.Resources>
                        <DataTemplate x:Key="FormsTemplate" >
                            <CheckBox Content="{Binding Id, Mode=TwoWay}" IsEnabled="{Binding IsEnabled}" >

                            </CheckBox>
                        </DataTemplate>
                        <sdk:HierarchicalDataTemplate x:Key="PackageTemplate" ItemsSource="{Binding Childs, Mode=TwoWay}" ItemTemplate="{StaticResource FormsTemplate}">
                            <TextBlock Text="{Binding Name, Mode=TwoWay}" />
                        </sdk:HierarchicalDataTemplate>                            
                    </sdk:TreeView.Resources>                        
                </sdk:TreeView>

注:ビューモデルコンストラクターのPackagesCollectionに値を入力しています。それは問題になりますか?何か足りないものがあれば教えてください。また、これを解決するための最善の方法を提案してください。

前もって感謝します。

4

1 に答える 1

1

編集:

「PackageTemplate」のバインディングは「Name」に設定されていますが、クラスのパブリックプロパティは「PackageName」です。

これは、データを作成して添付するサンプルです。私はこれをテストしました、そしてそれは働きます。

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new ViewModel();
    }

    public class Package
    {
        public string Name { get; set; }
        public ObservableCollection<Child> Childs { get; set; }
    }

    public class Child
    {
        public string ChildName { get; set; }
        public bool IsEnabled { get; set; }
    }

    public class ViewModel  : INotifyPropertyChanged
    {
        private ObservableCollection<Package> _packages;

        public event PropertyChangedEventHandler PropertyChanged;

        public string TestStr { get { return "testing123"; } }

        public ViewModel()
        {
            List<Package> list = new List<Package>() { new Package() { Name = "pkg1", Childs = new ObservableCollection<Child>(new List<Child>() { new Child() { ChildName = "Child1" } }) } };
            this.Packages = new ObservableCollection<Package>(list);
        }

        public ObservableCollection<Package> Packages
        {
            get
            {
                return this._packages;
            }
            set
            {
                this._packages = value;
            }
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

いくつかのこと:

ビジネスオブジェクトは次のようになります。

public class Package
    {
        public string Name { get; set; }
        public ObservableCollection<Child> Childs { get; set; }
    }

    public class Child
    {
        public string ChildName { get; set; }
        public bool IsEnabled { get; set; }
    }

バインドはパブリックプロパティでのみ機能し、プライベートフィールドでは機能しません

xamlは次のように修正できます。

<sdk:TreeView ItemTemplate= "{StaticResoruce PackageTemplate}"  ItemsSource="{Binding Packages}">
<sdk:TreeView.Resources>
    <sdk:HierarchicalDataTemplate x:Key="PackageTemplate" 
                                      ItemsSource="{Binding Childs,Mode=TwoWay}"
                                      ItemTemplate="{StaticResource ChildTemplate}">
        <TextBlock Text="{Binding Name,Mode=TwoWay}" />
    </sdk:HierarchicalDataTemplate>

    <sdk:DataTemplate x:Key="ChildTemplate" >
        <CheckBox  Content="{Binding ChildName,Mode=TwoWay}"
                       IsEnabled="{Binding IsEnabled}">
        </CheckBox>
    </sdk:DataTemplate>
</sdk:TreeView.Resources>

テンプレートは、TreeViewまたはUserControlのいずれかで囲まれた「リソース」ブラケット内にある必要があります。

PackageTemplateには、PackagesではなくItemsSource「Childs」が含まれている必要があります。PackageTemplateを「PackageName」にバインドしていますが、Packageクラスには「Name」と記載されています。

エラーではありませんが、ChildTemplateには独自の子がないため、階層ではなくDataTemplateである必要があります。

また

ItemTemplate= {"StaticResoruce PackageTemplate"}

する必要があります:

ItemTemplate= "{StaticResource PackageTemplate}"
于 2012-06-07T00:31:54.430 に答える