积极答复者
向大家请教一个 wpf 绑定值得问题

问题
-
xaml:<UserControl.Resources> <ResourceDictionary> <DataTemplate x:Key="DateTemplate" > <DatePicker Name="EditDateTime" SelectedDate="{Binding OpValue}"></DatePicker> </DataTemplate> <DataTemplate x:Key="TxtTemplate"> <TextBox Name="EditTxt" Text="{Binding OpValue}"></TextBox> </DataTemplate> </ResourceDictionary> </UserControl.Resources> <DataGrid Margin="5" Grid.Row="1" CanUserAddRows="False" Name="DGList2" > <DataGrid.Columns> <DataGridComboBoxColumn Header="逻辑关系" Width="100" ItemsSource="{x:Static local:aSearch.opLogic}" DisplayMemberPath="SName" SelectedValuePath="SValue" TextBinding="{Binding Path=OpLogic}" ></DataGridComboBoxColumn> <DataGridComboBoxColumn Header="查询字段" Width="100" ItemsSource="{x:Static local:aSearch.opFields}" DisplayMemberPath="SName" SelectedValuePath="SValue" TextBinding="{Binding Path=OpField}"></DataGridComboBoxColumn> <DataGridComboBoxColumn Header="比较符" Width="100" ItemsSource="{x:Static local:aSearch.opMark}" DisplayMemberPath="SName" SelectedValuePath="SValue" TextBinding="{Binding Path=OpMark}"></DataGridComboBoxColumn> <DataGridTemplateColumn Header="查询值" Width="100" > </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
后台代码如下:
ObservableCollection<Model.SearchList> source = new ObservableCollection<Model.SearchList>(); public static List<SearchModel> opLogic = new List<SearchModel>() { new SearchModel() { SName="并且",SValue="and"}, new SearchModel() { SName="或者",SValue="or"} }; public static List<SearchModel> opMark = new List<SearchModel>() { new SearchModel() { SName="等于",SValue="=",DataType="number,string,date"}, new SearchModel() { SName="大于",SValue=">",DataType="number,date"}, new SearchModel() { SName="大于等于",SValue=">=",DataType="number,date"}, new SearchModel() { SName="小于",SValue="<"}, new SearchModel() { SName="小于等于",SValue="<="}, new SearchModel() { SName="包含",SValue="like"}, new SearchModel() { SName="不包括",SValue="not like"} }; public static List<SearchModel> opFields = new List<SearchModel>() { new SearchModel() { SName="字符串类型",SValue="FBillNo",DataType="string"}, new SearchModel() { SName="日期类型",SValue="FDate",DataType="date"} }; public aSearch() { InitializeComponent(); DGList2.ItemsSource = source; } private void DGList2_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { var curItem = e.Row.Item as Model.SearchList; switch (e.Column.Header.ToString()) { case "查询字段": var fieldValue = (e.EditingElement as ComboBox).SelectedValue.ToString(); if (fieldValue != curItem.OpField) { DataGridCell cell = DGList2.GetCell(DGList2.Items.IndexOf(e.Row.Item), DGList2.Columns.IndexOf(e.Column) + 2); if (fieldValue.Equals("FDate")) { cell.ContentTemplate = this.FindResource("EditingDateTemplate") as DataTemplate; } else cell.ContentTemplate = this.FindResource("EditingDateTemplate2") as DataTemplate; } break; } }
现在主要问题是:查询值里面的内容没有绑定到 source 集合里面对应对象的 OpValue属性中。
我输出的都是空的内容。。
输出代码如下:
MessageShow(source.First().OpValue);
^_^
答案
-
Hi,应该有两个地方需要修改:
1,数据模板处改为
<DataTemplate x:Key="DateTemplate" > <DatePicker Name="EditDateTime" SelectedDate="{Binding OpValue, UpdateSourceTrigger=PropertyChanged}"></DatePicker> </DataTemplate> <DataTemplate x:Key="TxtTemplate"> <TextBox Name="EditTxt" Text="{Binding OpValue, UpdateSourceTrigger=PropertyChanged}"></TextBox> </DataTemplate>
2,在设置了DataGridCell.ContentTemplate后,必须对DataGridCell的Content赋值,另外,FindResource所用的名称好像也不对
case "查询字段": var fieldValue = (e.EditingElement as ComboBox).SelectedValue.ToString(); if (fieldValue != curItem.OpField) { DataGridCell cell = DGList2.GetCell(DGList2.Items.IndexOf(e.Row.Item), DGList2.Columns.IndexOf(e.Column) + 2); cell.Content = e.Row.Item;//或者cell.Content = cell.DataContext; if (fieldValue.Equals("FDate")) { cell.ContentTemplate = this.FindResource("DateTemplate") as DataTemplate; } else cell.ContentTemplate = this.FindResource("TxtTemplate") as DataTemplate; } break;
也可以直接对cell的Content赋值:
case "查询字段": var fieldValue = (e.EditingElement as ComboBox).SelectedValue.ToString(); if (fieldValue != curItem.OpField) { DataGridCell cell = DGList2.GetCell(DGList2.Items.IndexOf(e.Row.Item), DGList2.Columns.IndexOf(e.Column) + 2); if (fieldValue.Equals("FDate")) { cell.Content = (this.FindResource("DateTemplate") as DataTemplate).LoadContent(); } else cell.Content = (this.FindResource("TxtTemplate") as DataTemplate).LoadContent(); } break;
- 已编辑 lapheal 2014年4月16日 2:34
- 已建议为答案 Leo (Apple) YangModerator 2014年4月16日 5:14
- 已标记为答案 晴天大胜 2014年4月16日 9:26