WPF 十一 (ComboBox下拉选页面刷新时DataGrid变量绑定处理)

最近 在开发时,发现在ComboBox下拉选时,比如下拉选为ClassA时,当前页面的按钮使能状态以及数据状态,DataGrid数据,在切换为ClassB保存ClassA的,再切换为ClassA时需要为切换之前的状态,此时有两种解决办法:
一:ClassA为一套按钮,ClassB为一套按钮,当显示谁,另一个进行隐藏处理。但是这样的处理方式,需要写很多重复意义的变量,而且会造成高耦合,重复代码复用性问题。还比较low,不太建议。
二:采用面向对象的单一职责,一个对象一个类,进行处理,代码也不会复用,按钮都公用一个,只是前置对象进行处理,ComboBox下拉选有几个对象New几个,即可解决,下面为具体代码(DataGrid变量绑定比较麻烦):

1,后台ComboBox下拉选时,在主界面进行定义变量ClassViewModel2与ClassViewModel1,对应的ClassTabControlViewModel为界面具体的业务处理以及使能处理。当前界面进行ComboBox数据获取处理
ClassViewModel2 = new ClassTabControlViewModel("ComboBox2");
ClassViewModel1 = new ClassTabControlViewModel("ComboBox1");
2.前台界面数值绑定-ComboBox部分:
<Grid>
            <WrapPanel Grid.Row="0" HorizontalAlignment="Left">
                <ComboBox ItemsSource="{Binding ComboBoxList}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="180" FontSize="14">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <i:InvokeCommandAction Command="{Binding Path=SelectComboBoxChangeCommand}">
                            </i:InvokeCommandAction>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </ComboBox>
            </WrapPanel>
        </Grid>
3.前台界面数值绑定-button部分:
<Button  Command="{Binding ClassViewModel1 .StartCommand}"  Width="80" Height="28" Margin="10,0,8,8" ></Button>
4.前台界面数值绑定-DataGrid部分(ItemsSource为类下的属性,ItemsSource中的全局变量需要加DataContext,因为要识别为当前的ItemsSource,ItemsSource下的对象属性中不需要再加任务前置,因为在ItemsSource中已进行绑定)<DataGrid  ColumnHeaderHeight="28" HeadersVisibility="Column"  ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Visible" 
                                        ItemsSource="{Binding ClassViewModel1.DataList,Mode=TwoWay}"  FontSize="14">
                                                <DataGrid.Columns>
                                                    <DataGridTemplateColumn MinWidth="50" Width="0.5*" CanUserResize="False">
                                                        <DataGridTemplateColumn.HeaderTemplate >
                                                            <DataTemplate>
                                                                <Grid >
                                                                    <CheckBox  x:Name="CheckAll" Margin="10,0" 
                                                          IsChecked="{Binding DataContext.ClassViewModel1.IsAllChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged
                                                    , RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                                                </Grid>
                                                            </DataTemplate>
                                                        </DataGridTemplateColumn.HeaderTemplate >
                                                        <DataGridTemplateColumn.CellTemplate>
                                                            <DataTemplate>
                                                                <Grid >
                                                                    <CheckBox  Margin="10,0" 
                                                           IsChecked="{Binding IsCheck, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  />
                                                                </Grid>
                                                            </DataTemplate>
                                                        </DataGridTemplateColumn.CellTemplate>
                                                    </DataGridTemplateColumn>
                                                    <DataGridTextColumn  Binding="{Binding Property1}"   MinWidth="100" Width="*" />
                                                </DataGrid.Columns>
                                            </DataGrid>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现WPF ComboBox下拉绑定Treeview功能,可以参考以下步骤: 1. 创建一个ViewModel,其中包含一个ObservableCollection用于绑定ComboBox的ItemsSource,同也包含一个ObservableCollection用于绑定TreeView的ItemsSource。 2. 在ViewModel的构造函数中,初始化ComboBox的ItemsSource和TreeView的ItemsSource。 3. 在ComboBox的SelectedIndexChanged事件中,获取中项的子节点数据,将其添加到TreeView的ItemsSource中。 4. 在XAML中,使用ComboBox和TreeView控件,并将它们的ItemsSource绑定到ViewModel中的相应属性。 下面是一个简单的示例代码: ViewModel: ```c# public class MainViewModel : INotifyPropertyChanged { private ObservableCollection<string> _comboBoxItemsSource; private ObservableCollection<string> _treeViewItemsSource; public MainViewModel() { // 初始化ComboBox的ItemsSource ComboBoxItemsSource = new ObservableCollection<string> { "Node1", "Node2", "Node3" }; // 初始化TreeView的ItemsSource TreeViewItemsSource = new ObservableCollection<string> { "Root" }; } public ObservableCollection<string> ComboBoxItemsSource { get => _comboBoxItemsSource; set { _comboBoxItemsSource = value; OnPropertyChanged(); } } public ObservableCollection<string> TreeViewItemsSource { get => _treeViewItemsSource; set { _treeViewItemsSource = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` XAML: ```xml <Window.DataContext> <local:MainViewModel /> </Window.DataContext> <Grid> <ComboBox ItemsSource="{Binding ComboBoxItemsSource}" SelectedIndex="0" Width="100" /> <TreeView ItemsSource="{Binding TreeViewItemsSource}" Margin="0,30,0,0"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </Grid> ``` 在ComboBox的SelectedIndexChanged事件中,获取中项的子节点数据,将其添加到TreeView的ItemsSource中。 ```c# private void ComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedItem = e.AddedItems[0] as string; // 根据中项获取子节点数据 var children = GetChildren(selectedItem); // 将子节点数据添加到TreeView的ItemsSource中 var root = TreeViewItemsSource[0]; if (root == "Root") { TreeViewItemsSource.Clear(); TreeViewItemsSource.Add(new Node { Name = "Root", Children = children }); } else { var node = TreeViewItemsSource[0] as Node; node.Children = children; } } private ObservableCollection<Node> GetChildren(string selectedItem) { // TODO: 根据中项获取子节点数据 return new ObservableCollection<Node> { new Node { Name = $"{selectedItem}-1" }, new Node { Name = $"{selectedItem}-2" }, new Node { Name = $"{selectedItem}-3" } }; } public class Node { public string Name { get; set; } public ObservableCollection<Node> Children { get; set; } } ``` 以上示例代码仅供参考,实现过程中可能需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值