天天看點

【WPF】ComboBoxItem的禁用

原文: 【WPF】ComboBoxItem的禁用

需求:下拉清單ComboBox中,要求部分Item不可用。效果是滑鼠一上去後不獲得焦點,且無法點選。

前台XAML界面:

<!-- 下拉清單:省份 -->
<ComboBox Grid.Column="0" Grid.Row="0" x:Name="provinceComboxBox" Margin="20,10,0,200" Height="20"
          ItemsSource="{Binding ProvinceList}" FontSize="12" Style="{StaticResource myComboBox_Useable}">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter  Property="IsEnabled" Value="{Binding isEnabled}" />
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>           

樣式檔案如下:使得可用于不可用的Item文字顔色不同,顯示的文字是實體類中的”provinceName”屬性。

<!-- 樣式:x:Key="myComboBox_Useable" 下拉清單中,可能包含不可選的Item! -->
<Style x:Key="myComboBox_Useable" TargetType="{x:Type ComboBox}">
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>

    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{Binding Path=provinceName}">
                    <TextBlock.Style>
                        <Style TargetType="TextBlock">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding isEnabled}" Value="True">
                                    <DataTrigger.Setters>
                                        <Setter Property="Foreground" Value="blue"/>
                                        <!--<Setter Property="IsEnabled" Value="{Binding isEnabled}" />--><!-- 經測試,在樣式中寫無效,改到在前台寫 -->
                                    </DataTrigger.Setters>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding isEnabled}" Value="False">
                                    <DataTrigger.Setters>
                                        <Setter Property="Foreground" Value="Pink"/>
                                        <!--<Setter Property="IsEnabled" Value="{Binding isEnabled}" />--><!-- 經測試,在樣式中寫無效,改到在前台寫 -->
                                    </DataTrigger.Setters>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </DataTemplate>
        </Setter.Value>
    </Setter>

</Style>           

ViewModel中聲明前台控件ItemsSource綁定到的清單

private ObservableCollection<Provinces> provinceList;   // 所有省份的資訊
public ObservableCollection<Provinces> ProvinceList
{
    get { return provinceList; }
    set { SetProperty(ref provinceList, value); }
}           

注意,前台ComboBoxItem的”IsEnabled”屬性綁定到的是Provinces實體類中的”IsEnabled”屬性。

public class Provinces
{
    public int provinceId { get; set; }         // 省會ID
    public string provinceName { get; set; }    // 省會名稱
    public bool isEnabled { get; set; }         // 該省份是否可用
}           

控制層給ProvinceList清單填充資料即可。

houseTypeViewModel.ProvinceList.Clear();
houseTypeViewModel.ProvinceList = DataList; // 這是聯網擷取的資料!

foreach (var item in houseTypeViewModel.ProvinceList)
{
    // 模拟的資料
    if (item.provinceName.Equals("廣西壯族自治區") || item.provinceName.Equals("廣東省"))
    {
        item.isEnabled = true;
    }

    houseTypeViewModel.ProvinceName.Add(item.provinceName);
}           

最終效果如下圖:

【WPF】ComboBoxItem的禁用