为什么我需要在DataGrid上单击两次以更新我的Binding

时间:2014-10-30 15:37:39

标签: c# wpf wpfdatagrid

任何人都可以告诉我为什么我第一次输入新的DataGrid时需要点击两次才能让我的Label更新它的内容?我试图尽可能多地删除不需要的代码。

这是我的XAML

<Window x:Class="PSS.LateOrderPredictor.Ui.View.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:PSS.LateOrderPredictor.Ui.ViewModel"
    Title="MainWindow" Height="600" Width="1350
    " WindowState="Maximized">
<Window.Resources>
    ...
</Window.Resources>
<Window.DataContext>
    <vm:SoSummaryViewModel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="25"/>
        <ColumnDefinition Width="800"/>
        <ColumnDefinition Width="500"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ListBox ItemsSource="{Binding Path=SummaryLineItems}" 
             SelectedItem="{Binding Path=SelectedSalesOrderViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
             ...
             >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Expander HorizontalAlignment="Stretch"
                          MaxHeight="500">
                    <Expander.Header>
                        ...
                    </Expander.Header>
                    <DataGrid ItemsSource="{Binding Path=LineItems}" 
                              SelectedItem="{Binding Path=SelectedDemandEvent,     UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                          ...
                          />                        
                      </Expander>
                  </DataTemplate>
                </ListBox.ItemTemplate>
    </ListBox>
    <Label Grid.Column="2"
           Grid.Row="0"
           <!--Here is the label I am trying to set-->
           DataContext="{Binding Path=SelectedSalesOrderViewModel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
           Content="{Binding SelectedDemandEvent.PartNumber}"/>
           ...
    </Grid>
</Grid>

点击SelectedSalesOrderViewModelDataGridRow已设置,并且已包含在我的SoSummaryViewModel课程中。只要我点击新的DataGrid,它就会在第一次点击时设置。

public class SoSummaryViewModel : ViewModelBase
{
    ...
    /// <summary>
    /// The view model for the grid that contains the SelectedSalesOrderLine
    /// </summary>
    public SoSummaryLineViewModel SelectedSalesOrderViewModel
    {
        get { return _selectedSalesOrderViewModel; }
        set 
        {
            if (_selectedSalesOrderViewModel != value)
            {
                _selectedSalesOrderViewModel = value;
                OnPropertyChanged("SelectedSalesOrderViewModel");
            }
        }
    }      
}

在我最初的两次点击之后(只需要点击两次,而不是实际的双击事件),只要我保持在相同的DataGrid范围内,标签就会在所选行被更改时更新。 。我正在使用扩展器内部DataGrid,扩展器位于ListBox内。这是一张图片,这可能会更清楚。 enter image description here

1 个答案:

答案 0 :(得分:0)

就个人而言,我不会这样做

if (_selectedSalesOrderViewModel != value)
    ...

您需要点击两次,因为您的第一次点击不会更改DataGrid中的选择(我假设)。此外,如果你扩展了2个项目(可能吗?),那将会非常奇怪,因为有两个DataGrids绑定到同一个项目;如果一个人有10个项目并且选择了第10个,那么应该如何处理第二个,只有5个项目可以处理?

尝试对OneWay使用Label绑定,为OneWayToSource使用DataGrid

P.S。:我不确定这是否是正确的答案,但这对评论来说太过分了。