MVVM-Light模式,在dataGrid的模板下,绑定事件不触发的原因已经服务端排序的实现

如果以下绑定,DataGrid 模板里的Radio 的绑定事件将不会被触发:

<sdk:DataGrid Grid.Column="0" x:Name="dataGrid" IsReadOnly="True"  AutoGenerateColumns="False"  Width="auto" Height="auto" HorizontalAlignment="Left" VerticalAlignment="Top"  
                              ItemsSource="{Binding NoticeCollection,Mode=TwoWay}" IsTabStop="False" Style="{StaticResource DataGridStyle}"  ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyle}"  RowStyle="{StaticResource DataGridRowStyle}" >
                        <i:Interaction.Triggers>
                            <i:EventTrigger  EventName="MouseLeftButtonDown">
                                <ei:CallMethodAction  MethodName="DatagridMouseLeftButtonDown" TargetObject="{Binding}">
                                </ei:CallMethodAction>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <sdk:DataGrid.Columns>
                            <sdk:DataGridTemplateColumn Header="选项" Width="0.1*">
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <RadioButton  GroupName="sel" Command="{Binding MessageSelected}" CommandParameter="{Binding Id,Mode=OneWay}" ></RadioButton>
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                            <sdk:DataGridTemplateColumn Header="标题"  Width="0.3*" >
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <HyperlinkButton  Content="{Binding Title,Mode=OneWay}" Style="{StaticResource PageHyperlinkButtonStyle}"  Command="{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.ViewMsgCommand}" CommandParameter="{Binding Id,Mode=OneWay}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                            <sdk:DataGridTextColumn Header="信息内容" Width="0.4*" Binding="{Binding Content,Mode=OneWay}"></sdk:DataGridTextColumn>
                            <!--<sdk:DataGridTextColumn Header="创建时间"   Width="0.2*" Binding="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}"></sdk:DataGridTextColumn>-->
                            <sdk:DataGridTemplateColumn Header="创建时间" Width="0.2*" >
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <TextBlock Text="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                        </sdk:DataGrid.Columns>
                    </sdk:DataGrid>


原因是 DataGrid.Columns 不是依赖属性,所有绑定的dataContext将会丢失,所有可以用element-to-element的数据绑定来解决此问题

         <sdk:DataGrid Grid.Column="0" x:Name="dataGrid" IsReadOnly="True"  AutoGenerateColumns="False"  Width="auto" Height="auto" HorizontalAlignment="Left" VerticalAlignment="Top"  
                              ItemsSource="{Binding NoticeCollection,Mode=TwoWay}" IsTabStop="False" Style="{StaticResource DataGridStyle}"  ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyle}"  RowStyle="{StaticResource DataGridRowStyle}" >
                        <i:Interaction.Triggers>
                            <i:EventTrigger  EventName="MouseLeftButtonDown">
                                <ei:CallMethodAction  MethodName="DatagridMouseLeftButtonDown" TargetObject="{Binding}">
                                </ei:CallMethodAction>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <sdk:DataGrid.Columns>
                            <sdk:DataGridTemplateColumn Header="选项" Width="0.1*">
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <RadioButton  GroupName="sel" Command="{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.MessageSelected}" CommandParameter="{Binding Id,Mode=OneWay}" ></RadioButton>
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                            <sdk:DataGridTemplateColumn Header="标题"  Width="0.3*" >
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <HyperlinkButton  Content="{Binding Title,Mode=OneWay}" Style="{StaticResource PageHyperlinkButtonStyle}"  Command="{Binding Source={StaticResource Locator},Path=NoticeListViewModelStatic.ViewMsgCommand}" CommandParameter="{Binding Id,Mode=OneWay}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                            <sdk:DataGridTextColumn Header="信息内容" Width="0.4*" Binding="{Binding Content,Mode=OneWay}"></sdk:DataGridTextColumn>
                            <!--<sdk:DataGridTextColumn Header="创建时间"   Width="0.2*" Binding="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}"></sdk:DataGridTextColumn>-->
                            <sdk:DataGridTemplateColumn Header="创建时间" Width="0.2*" >
                                <sdk:DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,7,0,0">
                                            <TextBlock Text="{Binding CreateTime,Mode=OneWay,StringFormat='yyy-MM-dd HH:mm'}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:DataGridTemplateColumn.CellTemplate>
                            </sdk:DataGridTemplateColumn>
                        </sdk:DataGrid.Columns>
                    </sdk:DataGrid>
顺便提一下,silverlight的dataGrid 在MVVM模式下的排序事件实现:

在View里声明出发前:

 <i:Interaction.Triggers>
                            <i:EventTrigger  EventName="MouseLeftButtonDown">
                                <ei:CallMethodAction  MethodName="DatagridMouseLeftButtonDown" TargetObject="{Binding}">
                                </ei:CallMethodAction>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
在ViewModel里实现方法:

   public void DatagridMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var u =
                from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), sender as UIElement)
                where element is DataGridColumnHeader
                select element;
            if (u.Count() == 1)
            {
                e.Handled = true;
                var columnTag = ConvertColumnName(((DataGridColumnHeader)u.Single()).Content.ToString());
                if (string.IsNullOrEmpty(columnTag) || columnTag == "Serial" || columnTag == "Do")
                    return;
                Ascning = (OrderColumn == columnTag) && !Ascning;
                OrderColumn = columnTag;
                PagerInfo p = new PagerInfo();
                p.PageSize = this._pagesize;
                p.PageIndex = 1;
                this.PagerContext.MoveToFirstPage();
                SortType = Ascning ? "ASC" : "DESC";
                searchData(p, OrderColumn, SortType);
            }
        }


在WPF MVVM架构中,如果想在单例模式下更新DataGrid绑定的数据,通常你会遵循以下步骤: 1. **创建MVVM模式**: - 创建一个ViewModel类,例如`MyDataViewModel`,它包含了你的数据集合和相关的观察者(比如`ICollectionView`或`ObservableCollection`),以及更新数据的方法。 ```csharp public class MyDataViewModel { private ObservableCollection<MyObject> data; public ObservableCollection<MyObject> DataSource { get => data; set { if (value == data) return; data = value; OnPropertyChanged("DataSource"); } } public void UpdateData() { // 更新data集合... DataSource = new ObservableCollection<MyObject>(updatedData); } // Implement INotifyPropertyChanged for notifying UI changes public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 2. **单例窗口和绑定**: - 在`MainWindow`中,实例化单例的`MyDataViewModel`,并将DataGridBinding设置到`DataSource`属性上。 ```xaml <Window x:Class="YourNamespace.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <DataGrid ItemsSource="{Binding DataSource}" /> </Window> ``` - 在窗体加载或需要更新数据时,调用`MyDataViewModel`的`UpdateData()`方法。 ```csharp public MainWindow() { InitializeComponent(); // 单例实例 var viewModel = MyDataViewModel.Instance; DataContext = viewModel; // 更新数据示例 viewModel.UpdateData(); } ``` 3. **数据变化处理**: - 在ViewModel中添加数据变化监听,确保只有在需要的时候才更新UI,而不是每次数据更改都触发更新。 ```csharp public void UpdateData(int? filterValue) { if (filterValue.HasValue && !filteredData.Contains(filterValue)) { filteredData.Add(filterValue); UpdateDataSource(); } } private void UpdateDataSource() { // 在这里仅更新已过滤的数据,而不是整个集合 // ... RaisePropertyChange("FilteredDataSource"); } ``` 当你需要更新DataGrid时,传递相应的筛选条件给`UpdateData`方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值