带有绑定的WPF默认值(使用样式触发器)

时间:2013-03-15 18:13:12

标签: wpf wpf-controls

我是WPF的新手所以请耐心等待。我的WPF窗口上有一个ComboBox,ItemSource属性绑定到一个字符串List属性(Countries),SelectedItem绑定到一个字符串属性(SelectedCountry)。这两个属性都在后面的代码中 - 我将DataContext设置为“this”(即Window)。

ComboBox xaml是:

<ComboBox Name="CountryComboBox" 
    VerticalAlignment="Center" 
    Width="200"
    ItemsSource="{Binding Path=Countries, Mode=OneTime}"
    SelectedItem="{Binding Path=SelectedCountry, Mode=TwoWay}">
</ComboBox>

我希望在未选择项目时显示默认的“ - 请选择 - ”选项,因此我将以下xaml放在App.xaml中:

<Style TargetType="ComboBox">
    <Style.Triggers>
        <Trigger Property="SelectedItem" Value="{x:Null}">
            <Setter Property="IsEditable" Value="true" />
            <Setter Property="IsReadOnly" Value="true" />
            <Setter Property="Text" Value="- Please Select -" />
        </Trigger>
    </Style.Triggers>
</Style>

首次显示我的窗口时,组合框确实按预期显示“ - 请选择 - ”文本。然后,当我在组合框中选择一个值时,SelectedCountry会被适当地填充,但是当我将“null”分配给SelectedCountry属性时,当我希望它返回到“ - 请选择时,组合框仍然具有相同的选定国家/地区” - ”。我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:4)

ComboBox为空时,最好不要修改TextBlock并简单地将ComboBox覆盖在SelectedItem上。

ComboBoxTextBlock包裹在Grid中,并在DataTrigger上设置TextBlock以检查SelectedItem是否为Visibility null并切换其 <Grid> <ComboBox x:Name="combo" ItemsSource="{Binding Countries}" SelectedItem="{Binding SelectedItem}" /> <TextBlock x:Name="textblock" Text="- Please Select -" Margin="5,3,0,0" IsHitTestVisible="False"> <TextBlock.Style> <Style TargetType="TextBlock"> <Setter Property="Visibility" Value="Hidden" /> <Style.Triggers> <DataTrigger Binding="{Binding SelectedItem,ElementName=combo}" Value="{x:Null}"> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Grid>

示例:

{{1}}

结果:

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

您需要在“国家/地区”列表中插入一条值为null且名称为“ - 请选择 - ”的记录。

或者我认为您可以扩展ComboBox控件并编写自己的控件,以便您可以在列表中指定空值,而无需将记录放入“国家/地区”选项中。

但在这两者中,只是向国家添加记录要容易得多。