none
向大家请教一个 wpf 绑定值得问题 RRS feed

  • 问题



  • 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);



    ^_^

    2014年4月15日 6:53

答案

  • 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;


    2014年4月15日 15:46