任何人都可以告诉我为什么我第一次输入新的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>
点击SelectedSalesOrderViewModel
后DataGridRow
已设置,并且已包含在我的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
内。这是一张图片,这可能会更清楚。
答案 0 :(得分:0)
就个人而言,我不会这样做
if (_selectedSalesOrderViewModel != value)
...
您需要点击两次,因为您的第一次点击不会更改DataGrid
中的选择(我假设)。此外,如果你扩展了2个项目(可能吗?),那将会非常奇怪,因为有两个DataGrids
绑定到同一个项目;如果一个人有10个项目并且选择了第10个,那么应该如何处理第二个,只有5个项目可以处理?
尝试对OneWay
使用Label
绑定,为OneWayToSource
使用DataGrid
。
P.S。:我不确定这是否是正确的答案,但这对评论来说太过分了。