- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
WPF入门教程系列五——Window 介绍 。
13.通过Command指令,传递了下拉框所选择的省份,datagrid自动显示相应省份的城市信息,但是以上示例中有一个Bug,就是下拉框中绑定的数据无法显示.
这是由于DataGridComboBoxColumn若要填充下拉列表,请先使用以下选项之一设置 ItemsSource 属性 ComboBox :
1)静态资源。 使用StaticResource 标记扩展.
2)x:Static 代码实体。 使用x:Static 标记扩展.
3)类型的内联集合 ComboBoxItem .
14.比较适合的绑定方式是 2)x:Static 代码实体。 使用x:Static 标记扩展需要添加相应的命名空间。在Visual Studio 2022中打开MainWindows.xmal文件,并在文件的开头添加如下命名空间。 。
xmlns:v="clr-namespace:WpfGridDemo.NET7.ViewModel"
15. 在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn的ItemsSource进行了数据绑定。具体代码如下:
<
DataGridComboBoxColumn
Header
="城市"
Width
="120"
x:Name
="cboCity"
ItemsSource
="
{x:Static v:MainWindowVM.GridCityList}
"
ClipboardContentBinding
="
{x:Null}
"
SelectedValuePath
="Code"
SelectedValueBinding
="
{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}
"
DisplayMemberPath
="Name"
SelectedItemBinding
="
{x:Null}
"
/>
private
static
ObservableCollection<City>
cityList;
public
static
ObservableCollection<City>
GridCityList {
get
{
return
cityList; }
set
{ cityList
=
value;
new
ViewModelBase().RaisePropertyChanged(
"
GridCityList
"
); } }
。
。
。
。
。
18. 使用静态代码实体的方式,实现省市县联动失败了。又不想使用其他两种方式。在一阵猛于虎的搜索之后,发现一种实现方式。在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn进行了数据绑定。具体代码如下:
<
DataGridComboBoxColumn
Header
="城市(Style)"
SelectedValuePath
="Code"
SelectedValueBinding
="
{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}
"
DisplayMemberPath
="Name"
SelectedItemBinding
="
{x:Null}
"
Width
="1*"
>
<
DataGridComboBoxColumn.EditingElementStyle
>
<
Style
TargetType
="ComboBox"
>
<
Setter
Property
="ItemsSource"
Value
="
{Binding Path=DataContext.GridCity,ElementName=gridArea}
"
/>
</
Style
>
</
DataGridComboBoxColumn.EditingElementStyle
>
<
DataGridComboBoxColumn.ElementStyle
>
<
Style
TargetType
="ComboBox"
>
<
Setter
Property
="ItemsSource"
Value
="
{Binding Path=DataContext.GridCity,ElementName=gridArea}
"
/>
</
Style
>
</
DataGridComboBoxColumn.ElementStyle
>
</
DataGridComboBoxColumn
>
19.在Visual Studio 2022的解决方案资源管理器中,找到 MainWindowVM.cs 文件,添加一个 GridCity属性,用于绑定DataGridComboBoxColumn的ItemsSource。以下是属性代码,更完整的代码,请参见下面类的完整代码.
private
ObservableCollection<City>
listCity;
public
ObservableCollection<City>
GridCity {
get
{
return
listCity; }
set
{ listCity
=
value; RaisePropertyChanged(
"
GridCity
"
); } }
<
Window
x:Class
="WpfGridDemo.NET7.MainWindow"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:be
="http://schemas.microsoft.com/xaml/behaviors"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local
="clr-namespace:WpfGridDemo.NET7"
xmlns:v
="clr-namespace:WpfGridDemo.NET7.ViewModel"
mc:Ignorable
="d"
Title
="MainWindow"
Height
="600"
Width
="960"
Loaded
="Window_Loaded"
>
<
Grid
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
="100"
></
RowDefinition
>
<
RowDefinition
Height
="*"
></
RowDefinition
>
<
RowDefinition
Height
="25"
></
RowDefinition
>
</
Grid.RowDefinitions
>
<
WrapPanel
Grid.Row
="0"
HorizontalAlignment
="Left"
>
<
ComboBox
x:Name
="cboProvince"
DisplayMemberPath
="Name"
SelectedValuePath
="Code"
>
<
be:Interaction.Triggers
>
<
be:EventTrigger
EventName
="SelectionChanged"
>
<
be:InvokeCommandAction
Command
="
{Binding ProviceChangedAction}
"
CommandParameter
="
{Binding ElementName=cboProvince}
"
/>
</
be:EventTrigger
>
</
be:Interaction.Triggers
>
</
ComboBox
>
</
WrapPanel
>
<
DataGrid
x:Name
="gridArea"
Grid.Row
="1"
ItemsSource
="
{Binding GridAreaList}
"
AutoGenerateColumns
="False"
HorizontalAlignment
="Left"
VerticalAlignment
="Top"
SelectedItem
="
{Binding Path=AreaVM,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}
"
>
<
DataGrid.Columns
>
<
DataGridComboBoxColumn
Header
="城市"
Width
="120"
x:Name
="cboCity"
ItemsSource
="
{x:Static v:MainWindowVM.GridCityList}
"
ClipboardContentBinding
="
{x:Null}
"
SelectedValuePath
="Code"
SelectedValueBinding
="
{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}
"
DisplayMemberPath
="Name"
SelectedItemBinding
="
{x:Null}
"
/>
<
DataGridComboBoxColumn
Header
="城市(Style)"
SelectedValuePath
="Code"
SelectedValueBinding
="
{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}
"
DisplayMemberPath
="Name"
SelectedItemBinding
="
{x:Null}
"
Width
="1*"
>
<
DataGridComboBoxColumn.EditingElementStyle
>
<
Style
TargetType
="ComboBox"
>
<
Setter
Property
="ItemsSource"
Value
="
{Binding Path=DataContext.GridCity,ElementName=gridArea}
"
/>
</
Style
>
</
DataGridComboBoxColumn.EditingElementStyle
>
<
DataGridComboBoxColumn.ElementStyle
>
<
Style
TargetType
="ComboBox"
>
<
Setter
Property
="ItemsSource"
Value
="
{Binding Path=DataContext.GridCity,ElementName=gridArea}
"
/>
</
Style
>
</
DataGridComboBoxColumn.ElementStyle
>
</
DataGridComboBoxColumn
>
<
DataGridTextColumn
Header
="县区镇"
Width
="*"
Binding
="
{Binding Name}
"
ClipboardContentBinding
="
{x:Null}
"
/>
<
DataGridTextColumn
Header
="邮编"
Width
="100"
Binding
="
{Binding Code}
"
ClipboardContentBinding
="
{x:Null}
"
/>
<
DataGridTextColumn
Header
="创建时间"
Width
="160"
Binding
="
{Binding Created}
"
ClipboardContentBinding
="
{x:Null}
"
/>
<
DataGridTextColumn
Header
="更新时间"
Width
="160"
Binding
="
{Binding Updated}
"
ClipboardContentBinding
="
{x:Null}
"
/>
</
DataGrid.Columns
>
</
DataGrid
>
<
WrapPanel
Grid.Row
="2"
>
<
Button
x:Name
="btnRefresh"
Height
="22"
Width
="120"
Click
="btnRefresh_Click"
>
刷新
</
Button
>
<
Button
x:Name
="btnSave"
Height
="22"
Width
="120"
Command
="
{Binding ClickSaveAction}
"
>
保存
</
Button
>
</
WrapPanel
>
</
Grid
>
</
Window
>
。
using
Microsoft.EntityFrameworkCore;
using
System;
using
System.Collections.Generic;
using
System.Collections.ObjectModel;
using
System.ComponentModel;
using
System.DirectoryServices.ActiveDirectory;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
System.Windows.Controls;
using
System.Windows.Input;
using
WpfGridDemo.NET7.Entitys;
namespace
WpfGridDemo.NET7.ViewModel {
public
class
MainWindowVM: ViewModelBase {
public
MainWindowVM() { cityList
=
new
ObservableCollection<City>
(); areaList
=
new
ObservableCollection<Area>
(); listCity
=
new
ObservableCollection<City>
(); }
private
Area m_Area;
///
<summary>
///
县镇区数据
///
</summary>
public
Area AreaVM {
get
{
return
m_Area; }
set
{ m_Area =
value; } }
private
string
m_Province_Code;
///
<summary>
///
省--代码
///
</summary>
public
string
ProvinceCode {
get
=> m_Province_Code;
set
=> m_Province_Code =
value; }
private
ObservableCollection<Area>
areaList;
public
ObservableCollection<Area>
GridAreaList {
get
{
return
areaList; }
set
{ areaList
=
value; RaisePropertyChanged(
"
GridAreaList
"
); } }
private
static
ObservableCollection<City>
cityList;
public
static
ObservableCollection<City>
GridCityList {
get
{
return
cityList; }
set
{ cityList
=
value;
new
ViewModelBase().RaisePropertyChanged(
"
GridCityList
"
); } }
private
ObservableCollection<City>
listCity;
public
ObservableCollection<City>
GridCity {
get
{
return
listCity; }
set
{ listCity
=
value; RaisePropertyChanged(
"
GridCity
"
); } }
///
<summary>
///
命令要执行的方法
///
</summary>
void
SaveExecute() {
try
{ GridDbContext db
=
new
GridDbContext();
var
list=
db.Area.AsTracking().ToList(); Area modifyArea
= list.Where(x=>x.Id==
AreaVM.Id).FirstOrDefault();
if
(modifyArea !=
null
) { modifyArea.Name
=
AreaVM.Name; modifyArea.Updated
=
DateTime.Now; db.SaveChanges(); } }
catch
(Exception ex) {
throw
ex; } }
///
<summary>
///
命令是否可以执行
///
</summary>
///
<returns></returns>
bool
CanSaveExecute() {
return
false
; }
///
<summary>
///
创建新命令
///
</summary>
public
ICommand ClickSaveAction {
get
{
return
new
Command.SaveCommand(SaveExecute, CanSaveExecute); } }
//
combobox
///
<summary>
///
命令要执行的方法
///
</summary>
void
ProviceSelectionChangedExecute(
object
sender) {
try
{
if
(sender
is
ComboBox) { ComboBox drp
=sender
as
ComboBox; ProvinceCode
=
drp.SelectedValue.ToString(); GridDbContext db
=
new
GridDbContext();
var
list =
db.City.AsTracking().ToList(); List
<City> citys = list.Where(x => x.ProvinceCode ==
ProvinceCode).ToList();
var
cityCodes =
from
city
in
citys
select
city.Code; List
<Area> areas = db.Area.AsTracking().ToList()
.Where(x =>
cityCodes.Contains(x.CityCode)).ToList(); areaList.Clear();
if
(areas!=
null
) { areas.ForEach((t)
=>
{ areaList.Add(t); } ); } cityList.Clear();
if
(citys !=
null
) { citys.ForEach((t)
=>
{ cityList.Add(t); } ); } listCity.Clear();
if
(citys !=
null
) { citys.ForEach((t)
=>
{ listCity.Add(t); } ); } } }
catch
(Exception ex) {
throw
ex; } }
///
<summary>
///
命令是否可以执行
///
</summary>
///
<returns></returns>
bool
CanSelectionChangedExecute() {
return
true
; }
///
<summary>
///
创建新命令
///
</summary>
public
ICommand ProviceChangedAction {
get
{
return
new
Command.ProvinceChangedCommand<
object
>
(ProviceSelectionChangedExecute
, CanSelectionChangedExecute); } } } }
22.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化,其中使用静态实体代码绑定的城市下拉框中却没有任何数据。使用使用非静态资源,在<DataGridComboBoxColumn.EditingElementStyle>与 <DataGridComboBoxColumn.ElementStyle>两个样式中绑定combobox的itemSource属性方式,效果有效。如下图.
。
最后此篇关于WPF入门教程系列二十九——DataGrid使用示例MVVM模式(7)的文章就讲到这里了,如果你想了解更多关于WPF入门教程系列二十九——DataGrid使用示例MVVM模式(7)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我已经对这个主题进行了一些研究,并且已经在少数应用程序中使用了 MVVM 模式。 我问这个问题是因为有时 MVVM 被称为设计,有时被称为架构模式。 在大多数情况下,MVVM 模式称为设计模式。但是就
我开始使用 MVVM Light 版本 4,但我无法理解: 为什么要使用 DataService 和 IDataService? 我应该为模型中的任何类创建数据服务吗? 最佳答案 首先 - 像往常一样
是否可以采用MVVM在一个平台(如 windows phone)中设计模式并以可移植到其他平台(如 android 和 iOS)的方式实现代码的数据绑定(bind)? 或者我最好问问MVVM设计模式在
使用 avalondock在 MVVM 环境中似乎相当具有挑战性。一旦我从 shellview 中分离 DocumentPane,我就会丢失相应的数据上下文并且我的 View 是空的。重新连接时,它会
我对避免背后代码中的代码的方法很感兴趣。 在我看来,有些情况下代码必须放在代码后面。 例如:我有一个未定义列数的网格。无法绑定(bind)列。所以最简单的方法是在后面的代码中生成列。 对于这种情况,我
我熟悉MVVM。实际上,我在SL4中进行了大部分学习。但是,由于最近的需求,我必须使用SL3。我试图将MVVM Light v3与SL3结合使用并利用命令。问题是在SL3中没有按钮的Command属性
UI逻辑在WindowsRT MVVM应用程序中应该在哪里?将其放到ViewModel上真的很“胖”,我想我们失去了MVVM模式的优势之一-在设计人员和程序员之间分配工作变得非常困难。但是,我创建了一
您好,我有 3 个关于 MVVM 模型的问题。 有没有办法绕过那个多余的PropertyChanged("PropName"); 将 POCO 对象包装到 WPF 的最佳方法是什么 INotifyPr
我正在使用 MVVM 模型做一个 Silverlight,我发现很难通过 MVVM 进行事件处理,尤其是事件处理程序在 View 中进行了大量更改,例如启用和禁用按钮、更新媒体元素功能和位置。我还是
我有一个测试应用程序来测试 windows phone 8.1 上的导航,我可以从主页到第二页进入第二页。 问题是,当我单击后退按钮时,我返回桌面屏幕并且应用程序进入后台,所以我必须按住后退按钮才能返
我正在尝试使用并选择好的MVVM Framework,并且其中有很多,因此选择确实很困难。 我想知道其中的2个-CinchV2(Sacha Barber)和MVVM Light Toolkit(Lau
我完全不熟悉Windows 8开发,现在遇到使用MVVM Light混合触摸和键盘导航的问题。 所以,我有个 View 模型的列表,在网格 View 和只要选择其中的一个,导航到选定的 View 模型
我最近下载了MVVMExtraLite,并且有一个名为 Mediator 的帮助程序。我听说过 Messenger (在MVVM Light中)。有什么区别吗? 最佳答案 他们使用相同的模式,即调解员
我正在尝试学习MVVM,并且在区分模型和 View 模型方面有些挣扎。 如果有人可以回答这两个问题,那么对我来说将大有帮助: 说我有一个Objects类,这是一个包含Object的多个Observab
我已经在网上进行了一些研究,并且得出了一些矛盾的答案。这是我的情况: 我有一个引用ClientViewModel的EditClient View ,还有一个还引用ClientViewModel的Add
我正在使用带有 ModelView-First 方法的 MVVM 模式。到目前为止,这工作正常。 现在我有一个用户控件( View ),它应该根据位于我的 ViewModel 中的属性显示各种内容。
我必须创建一个对话框,其中必须在运行时生成列,之前我使用的是 WPF 数据网格,因此在运行时生成列不是问题。现在我必须使用 View 模型,我需要为要在 View 中显示为列的任何字段具有属性。列数在
所以我目前正在使用 Xamarin.Forms 开发一个应用程序。 Xamarin Forms 使用 MVVM 模式,我觉得使用这种模式有点舒服,但我确实有一些问题。为了简单起见,我将使用一个单页应用
是否有在MVVM应用程序中使用Autofac的示例?我不确定在MVVM环境中如何控制生命周期和对象处置。 我知道我可以创建一个生命周期并从其下解决,但这确实更像是服务定位器模式而不是IoC模式。 最佳
我想我遗漏了一些简单的东西,但我找不到任何例子来说明如何做到这一点......另外,如果我使用的某些术语是错误的,请原谅我。 我只想使用绑定(bind)到 Kendo Observable 对象的 H
我是一名优秀的程序员,十分优秀!