我的 ViewModel 中有以下屬性
public IEquipment Equipment
{
get
{
return equipment;
}
set
{
if (equipment != value)
{
equipment = value;
InvokePropertyChanged("Equipment");
}
}
}
該專案本身有一個bool屬性,該屬性系結到Ellipse我的視圖中的一個,我想將其用作指示項:
<Ellipse Width="10" Height="10" Fill="{Binding Equipment.IsAvailable, Converter={StaticResource BoolToColorConverter}, FallbackValue=DarkGray}" Margin="1"/>
在BoolToColorConverter簡單的色彩變換為是綠色(true)或紅色(false)。在運行時Equipment可以是繼承自IEquipment. 只有其中一個擁有該IsAvailable財產。在實踐中這很好用,我得到了八種紅色或綠色……或者灰色,以防其他型別的設備處于活動狀態。
問題是,每次 GUI 更新時,都會輸出以下警告:
System.Windows.Data 警告:40:BindingExpression 路徑錯誤:在“物件”上找不到“IsAvailable”屬性
我怎樣才能避免這個問題?基本上我只想系結到這個屬性,如果它是正確的型別。我可以想到兩種解決方案,但我并不是特別喜歡:
- 只需將該
IsAvailable屬性添加到其他型別并將其設定為 null(BoolToColorConverter可以處理 null 值并回傳深灰色):這對于簡單的 可能沒問題bool,但在我的實際情況下還有其他專案,它們非常特定于類。 - 在代碼隱藏中進行資料系結:這可能有效。使用
Loaded啟動時等事件在運行時根據型別手動設定系結。但是,這對于以后的除錯來說可能會很麻煩,因為專案中的所有其他 Bindings 都直接發生在 xaml 檔案中。此外,Equipment在 ViewModel 的生命周期內可能會發生變化,所以我必須以某種方式跟蹤它。
uj5u.com熱心網友回復:
Xaml 不系結到介面,它系結到具體型別。
如果您的型別具有不同的屬性,那么您需要不同的 xaml 來系結它們。
使用DataTemplates指定不同的 xaml 來顯示每種型別。
uj5u.com熱心網友回復:
如果您的IEquipment(此處Equipment和OtherEquipment作為示例)的衍生物的屬性差異很大并且不共享通用介面,則它們很可能在外觀上有所不同。在這種情況下DataTemplate,每種型別都需要不同的s。這是 a 的示例ContentControl,但它ItemsContol與自動應用的隱式資料模板(沒有x:Key,但是 a DataType)的作業方式相同。
<ContentControl Content="{Binding Equipment}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Equipment}">
<Ellipse Width="10" Height="10" Fill="{Binding IsAvailable, Converter={StaticResource BoolToColorConverter}, FallbackValue=DarkGray}" Margin="1"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:OtherEquipment}">
<Ellipse Width="10" Height="10" Fill="DarkGray" Margin="1"/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
針對您的特定問題的解決方法可能是撰寫自定義的專用值轉換器。
public class EquipmentAvailabilityToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Equipment equipment)
return equipment.IsAvailable ? Brushes.Green : Brushes.Red;
return (Brush)parameter;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException();
}
}
<Ellipse Width="10" Height="10" Fill="{Binding Equipment, Converter={StaticResource EquipmentAvailabilityToColorConverter}, ConverterParameter={x:Static Brushes.DarkGray}}" Margin="1"/>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331419.html
上一篇:ASP.NETCORE:嘗試激活“API.Controllers.UsersController”時無法決議“API.SQLConnection.IDBConnection”型別的服務
