【问题标题】:DataTemplate Binding Error数据模板绑定错误
【发布时间】:2013-07-01 18:37:17
【问题描述】:

我在解决数据模板中的绑定错误时遇到问题。我创建了一个可观察的集合,并为每个文件名设置了 mySelectFlag True。当 Datagrid 显示时,标题上的复选框被选中,并且 datagrid 中的每一行都有其复选框被选中。如果我选择/取消选择行复选框,则更改会显示在可观察的集合中。如果我取消选中标题复选框,我会将可观察集合上的每条记录设置为 false。我在可观察集合上调用 OnPropertyChanged,但数据网格不反映更改。没有绑定错误。谁能告诉我我做错了什么? 非常感谢。

我有一堂课:

public class InputFileName
        {
            public bool mySelectFlag { get; set; }
            public string myFileName { get; set; }
        }

还有一个 ObservableCollection:

private ObservableCollection<InputFileName> _DisplayList;
public ObservableCollection<InputFileName> DisplayList
{
     get { return _DisplayList; }
     set
     {
         if (value != _DisplayList)
         {
             _DisplayList = value;
             OnPropertyChanged("DisplayList");
         }
     }
 }

这是我的 xaml:

<DataGrid
     Margin="25"
     RowHeaderWidth="0"
     AutoGenerateColumns="False"
     AlternatingRowBackground="Gainsboro"
     AlternationCount="2"
     Block.TextAlignment="Center"
     CanUserAddRows="False"
     CanUserReorderColumns="False"
     CanUserResizeColumns="False"
     CanUserSortColumns="False"
     ItemsSource="{Binding Path=DisplayList}" >
     <DataGrid.Columns>
          <DataGridTemplateColumn>
               <DataGridTemplateColumn.HeaderStyle>
                    <Style TargetType="DataGridColumnHeader">
                         <Setter Property="ContentTemplate">
                              <Setter.Value>
                                   <DataTemplate>
                                        <CheckBox
                                             IsChecked="{Binding                Path=DataContext.IsSelected, ElementName=myControl1, FallbackValue=False}"
                                                        Command="{Binding Path=DataContext.SelectAllRows, ElementName=myControl1}"
                                                        Content="Select"
                                                        FontWeight="Bold"
                                                        Width="Auto" />
                                     </DataTemplate>
                                  </Setter.Value>
                                </Setter>
                             </Style>
                             </DataGridTemplateColumn.HeaderStyle>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox
                                            HorizontalAlignment="Center"
                                            VerticalAlignment="Center"
                                            IsChecked="{Binding Path=mySelectFlag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, FallbackValue=False}"
                                            Command="{Binding Path=DataContext.TestTaskCommand, ElementName=myControl1}"
                                            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=SelectedIndex}" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn
                                Header="File Name"
                                FontWeight="Bold"
                                Width="Auto"
                                Binding="{Binding Path=myFileName}" />
                        </DataGrid.Columns>
                    </DataGrid>

【问题讨论】:

    标签: c# wpf visual-studio-2010 c#-4.0


    【解决方案1】:

    您还需要在 InputFileName 类上实现 INotifyPropertyChanged 接口,以使更改对 UI 可见 -

    private bool mySelectFlag;
    public bool MySelectFlag
    {
       get
       {
          return mySelectFlag;
       }
       set
       {
          mySelectFlag = value;
          OnPropertyChanged("MySelectFlag");
       }
    }
    

    【讨论】:

    • 做到了!非常感谢!
    【解决方案2】:

    INotifyPropertyChanged 接口由你的类实现,方法应该定义如下,所有属性都应该调用 OnPropertyChangeEvent

    公共事件 PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string e)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(e));
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2011-04-30
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多