TabControl中的WPF DataGrid行选择

时间:2014-12-23 10:45:34

标签: wpf mvvm caliburn.micro

我的WPF应用程序中有一个选项卡控件,它有4个选项卡,每个选项卡都有不同的数据网格, 我在Tab SelectionChanged上填充数据网格。网格填充正确。我遇到的一个问题是,当我点击任何标签的datagrid时,会添加一个带有默认值的额外行。 我调试它,发现当我点击datagrid时,Selectionchanged方法击中了两次 这是我的带有selectionchanged的TabControl

<TabControl x:Name="tabControl"  Grid.Row="1" SelectedValue="{Binding SelectedTab}" Style="{StaticResource Light-TabControlStyle}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <cal:ActionMessage MethodName="LoadTabGrid" cal:View.Model="{Binding Source={StaticResource VMResource}}">
                            </cal:ActionMessage>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>                 
                    <TabItem Header="Users">
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" MinWidth="140"/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>             
                            <DataGrid x:Name="dgotherUsers" ItemsSource="{Binding MyDS}"  AutoGenerateColumns="False" 
                                      Grid.Column="1" >
                                <DataGrid.Columns>
                                    <DataGridTextColumn Binding="{Binding UserName}" Header="Sets" Width="*" CanUserSort="False"/>
                                    <DataGridTextColumn Binding="{Binding Age}" Header="Sits" Width="*" CanUserSort="False"/>
                                    <DataGridTextColumn Binding="{Binding Gender}" Header="Sales" Width="*" CanUserSort="False"/>
                                    <DataGridTextColumn Binding="{Binding Salary}" Header="ALP" Width="*" CanUserSort="False"/>                                    
                                </DataGrid.Columns>
                            </DataGrid>                            
                        </Grid>
                    </TabItem>
                    </TabControl>

在我的ViewModel

 public void LoadTabGrid()
            {
                //Updating MyDS

                }

这是MyDS

ObservableCollection<UsersInfo> _usersInfo;
public ObservableCollection<UsersInfo> MyDS
{
    get { return _usersInfo; }
    set { _usersInfo= value; NotifyOfPropertyChange("MyDS"); }
}

我在数据网格中尝试了这个

  <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="SelectionChanged">
                                        <cal:ActionMessage MethodName="DGSelection" cal:View.Model="{Binding Source={StaticResource VMResource}}">

                                        </cal:ActionMessage>
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>

使用上面的方法,DGSelection命中一次,而LoadTabGrid也是命中,我需要在点击datagrid时停止点击LoadTabGrid,或者当我点击datagrid时,只需点击一次此方法, 当我点击标签时它工作正常。 我该怎么做?

1 个答案:

答案 0 :(得分:0)

使用Caliburn时,问题是一个已知问题。

Caliburn为绑定目的解析属性,如果它们没有值并且类型已注册到它使用的容器,则使用Property Injection来满足它们。

ItemsSource中的EXTRA项是填充了一些如何使用依赖注入的值。 可能来自绑定到SelectedItem的属性(我无法从问题中获得所有范围的东西)。

解决方法:

1)在填充之前清除ObservableCollection。 2)使其成为ObservableCollection