最近 在开发时,发现在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>