我有一个带有CellTemplate / CellEditingTemplate的datagridtemplatecolumn,工作正常,加载后显示以前从模型中选择的选定值。 但问题是,当我'通过列'时,组合框丢失了它的选择值并给我一个空的?
我希望我的代码有问题:
<data:DataGridTemplateColumn x:Name="colPosId" Width="80">
<data:DataGridTemplateColumn.HeaderStyle>
<Style TargetType="dataprimitives:DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Resource.lblPosId, Source={StaticResource CustomLocStrings}}" Style="{StaticResource ColumnHeaderTextBoxStyleCentered}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</data:DataGridTemplateColumn.HeaderStyle>
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Model.posid}" Style="{StaticResource ColumnTextBoxStyleCentered}" />
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
Height="23" HorizontalAlignment="Left"
x:Name="cmbPositions" VerticalAlignment="Top" Width="100" ItemsSource="{Binding PositionVM.Positions, Mode=TwoWay}" SelectedValue="{Binding Model.posid, Mode=TwoWay}"
DisplayMemberPath="Model.name" SelectedValuePath="Model.posid">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding MainScore.SelectionPosChangedCommand, Mode=OneWay, Source={StaticResource Locator}}" CommandParameter="{Binding SelectedValue, ElementName=cmbPositions}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
亲切的问候,
麦克
答案 0 :(得分:1)
尝试使用SelectedItem而不是SelectedValue。
为什么使用SelectionChangedTrigger?当你使用TwoWay绑定SelectedItem时,你可以选择你的viewmodel。
您还应该将ItemsSource绑定更改为Mode = OneWay或OneTime。 TwoWay Binding在这里毫无意义。
答案 1 :(得分:0)
通过删除EventTrigger EventName =“SelectionChanged部分来修复它。 触发器用于根据组合框A的选择生成组合框B的项目源。
我用functionhandler
替换了functionallity _selectedScore.Model.PropertyChanged += SelectedScore_PropertyChanged;
public void SelectedScore_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName =="posid" )
{
this.UpdateFilteredRules(SelectedScore.Model.posid);
}
if (e.PropertyName == "playerid")
{
this.SelectedScore.Model.posid = this.SelectedScore.PlayerVM.GetPosId(SelectedScore.Model.playerid).Model.posid;
}
}