需求:下拉清單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);
}
最終效果如下圖:
