I have a ComboBox where I need to do this:
<ComboBox x:Name="CitySelectComboBox" SelectedValuePath="Text">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding DownloadWeatherCommand}"
CommandParameter="{Binding ElementName=CitySelectComboBox, Path=SelectedValue}" />
</b:EventTrigger>
<b:EventTrigger EventName="SelectionChanged">
<b:InvokeCommandAction Command="{Binding DownloadWeatherCommand}"
CommandParameter="{Binding ElementName=CitySelectComboBox, Path=SelectedValue}" />
</b:EventTrigger>
</b:Interaction.Triggers>
<ComboBoxItem IsSelected="True">
<TextBlock Text="Praha"/>
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Brno"/>
</ComboBoxItem>
</ComboBox>
As you can see, I am trying to access the Text property of Textblock inside the ComboBoxItem. Just putting Text does not work as I get the following error:
BindingExpression path error: 'Text' property not found on 'object' ''ComboBoxItem' (Name='')'.
I need to find out how to specify the path to this property in the SelectedValuePath but no online resources have been helpful. The code otherwise works if I include the city names inside the ComboBoxItem as <ComboBoxItem Content="Praha"/>, but I need to take the name from the child element TextBlock.
CodePudding user response:
SelectedValuePath targets the SelectedItem, which is a ComboBoxItem in your case. ComboBoxItem does not have a Text property.
The TextBlock is assigned to the ComboBoxItem.Content property.
The valid property path is therefore "Content.Text":
<ComboBox SelectedValuePath="Content.Text">
<ComboBoxItem IsSelected="True">
<TextBlock Text="Praha" />
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="Brno" />
</ComboBoxItem>
</ComboBox>
Because the ComboBoxItem (or ContentPresenter to be precise) will create a TextBlock implicitly in case the Content value is a string, defining a TextBlock explicitly is redundant.
Instead set the Content property directly. This reduces code and enhances the readability of your code:
<ComboBox SelectedValuePath="Content">
<ComboBoxItem IsSelected="True"
Content="Praha" />
<!-- Alternative content property syntax -->
<ComboBoxItem>Brno</ComboBoxItem>
</ComboBox>
