【问题标题】:Data Binding TreeView with CheckBoxes WPF带有 CheckBoxes WPF 的数据绑定 TreeView
【发布时间】:2014-05-12 17:23:19
【问题描述】:

我有一个窗口

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:GRHelper="clr-namespace:Enertek.GRHelper;assembly=Enertek.GRHelper" xmlns:local="clr-namespace:EneGR" x:Class="EneGR.SearchWindow"
        Title="Main Window" Height="274.753" Width="322.345" Icon="icon.ico">
    <Window.OpacityMask>
        <RadialGradientBrush>
            <GradientStop Color="Black" Offset="0"/>
            <GradientStop Color="White" Offset="1"/>
        </RadialGradientBrush>
    </Window.OpacityMask>
    <Window.BorderBrush>
        <ImageBrush Stretch="None" TileMode="FlipXY"/>
    </Window.BorderBrush>

    <Grid RenderTransformOrigin="0.5,0.5" Margin="0,0,2,6">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="auto" MinWidth="120"/>
            <ColumnDefinition Width="65"/>
            <ColumnDefinition Width="120"/>
            <ColumnDefinition Width="70"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="SearchButton" Content="Search" Grid.Column="3" Margin="0,62,0,0" VerticalAlignment="Top" Height="23" RenderTransformOrigin="0.6,0.458" FontWeight="Bold"
            Click="SearchButton_Click"/>
        <Label x:Name="SearchLabel" Content="Enter object's name or its part in the field below:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" Grid.ColumnSpan="4" Width="285" Height="36"/>
        <Button x:Name="SearchCancel" Grid.ColumnSpan="2" Content="Cancel" HorizontalAlignment="Left" Margin="0,61,0,0" VerticalAlignment="Top" Width="120" Height="24" FontWeight="Bold"
            Click=" SearchCancel_Click"/>
        <TreeView  Grid.Column ="1" ItemsSource="{Binding objs}" Margin="0,101,3,40" Grid.ColumnSpan="3" Background="White">

            <TreeView.DataContext>
                <local:MyTreeData/>
            </TreeView.DataContext>
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Checked, Mode=TwoWay}" Content="{Binding TagName}" Checked="CheckBox_Checked"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>


        <Button x:Name="Rename" Content="Rename" Grid.Column="2" HorizontalAlignment="Left" Margin="62,212,0,0" VerticalAlignment="Top" Width="120" Grid.ColumnSpan="2" Click="Rename_Click" FontWeight="Bold"/>
        <TextBox x:Name="TagNameBox" Grid.ColumnSpan="3" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="10,33,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="285"/>
        <Button Content="Button" HorizontalAlignment="Left" Height="100" Margin="-106,257,0,-115" VerticalAlignment="Top" Width="75"/>

    </Grid>
</Window>

背后的代码:

namespace EneGR
{

    public class MyTreeData
    {
        public ObservableCollection<GRObject> objs { get; set; }
        private bool allAreChecked = false;

        public MyTreeData() 
        {
            objs = new ObservableCollection<GRObject>();

        }

        public bool AllAreChecked 
        {
            get 
            {
                return allAreChecked;
            }

            set 
            {
                allAreChecked = value;

            }
        }

    }

    /// <summary>
    /// Interaction logic for SearchWindow.xaml
    /// </summary>
    public partial class SearchWindow : Window
    {
        GRGalaxy galaxy = EneGR.LoginWin.galaxy;
        List <GRObject> ObjsToRename = null;
        public MyTreeData TreeData = new MyTreeData();  

        public SearchWindow()
        {
            InitializeComponent();

            DataContext = TreeData;
        }

        private void SearchCancel_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void SearchButton_Click(object sender, RoutedEventArgs e)
        {
            string TagName = TagNameBox.Text;

            IEnumerable<GRObject> objects = galaxy.QueryObjectsByName(TagName + '%');
            MessageBox.Show(objects.Count().ToString() + " " + "Objects found" );

            foreach (GRObject obj in objects) 
            {   
               TreeData.objs.Add(obj);
            };
        }


        private void Rename_Click(object sender, RoutedEventArgs e)
        {

            galaxy.RenameCheckedObjects(ObjsToRename);
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
           //add checked object to ienumerable collection ObjsToRename;
        }


    }
}

我使用 CheckBoxes 将可观察集合 TreeData.objs 中的对象绑定到 TreeView,但它们从未出现在窗口中。我无法理解出了什么问题。 IEnumerable 对象不为空。

【问题讨论】:

    标签: c# wpf data-binding checkbox treeview


    【解决方案1】:

    您可以删除此代码:

       <TreeView.DataContext>
            <local:MyTreeData/>
        </TreeView.DataContext>
    

    ... 创建一个新的 MyTreeData 实例并将 TreeView 的 DataContext 设置为它。

    您的树视图的上下文已设置为您要使用的 MyTreeData(因为 DataContext 继承):

       public SearchWindow()
        {
            InitializeComponent();
            DataContext = TreeData;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2014-08-09
      • 1970-01-01
      • 2018-03-20
      • 2010-09-16
      相关资源
      最近更新 更多