Mam przycisk ze stałym obrazem tła i chciałbym pokazać na nim mały obraz nakładki. Wybór obrazu nakładki zależy od właściwości zależności ( LapCounterPingStatus
) odpowiedniego modelu widoku.
Oto, co osiągnąłem do tej pory:
<Button>
<Grid>
<Image Stretch="None"> <!-- Background Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="/Images/Pingn.png"/>
</Style>
</Image.Style>
</Image>
<Image Stretch="None" Panel.ZIndex="1"> <!-- Small Overlay Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_UNKNOWN">
<Setter Property="Source" Value="/Images/RefreshOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_FAILURE">
<Setter Property="Source" Value="/Images/ErrorOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_SUCCESS">
<Setter Property="Source" Value="/Images/CheckmarkOverlayn.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</Button>
Odpowiednie części mojego modelu widoku
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
W tej chwili w ogóle nie jest wyświetlany obraz nakładki. Co się stało?
AKTUALIZACJA
Wyświetla się okno śledzenia mojego IDE System.ArgumentException
i System.FormatException
. Czy źródłem problemu może być nieznany typ wyliczenia PingStatus
w języku XAML?
Odpowiedzi:
Aby to działało, potrzebujesz 2 rzeczy:
1 - Dodaj
xmlns
odwołanie w elemencie głównym pliku XAML, do przestrzeni nazw, w której zdefiniowano Enum:2 - na
Value
własnośćDataTrigger
należy skorzystać z{x:Static}
formularza:Zwróć uwagę, że typ Enum musi być poprzedzony prefiksem xmlns zdefiniowanym powyżej.
Edytować:
Jeśli Twój Enum jest zadeklarowany wewnątrz klasy, musisz użyć składni:
{x:Static namespace:ClassName+EnumName.EnumValue}
na przykład:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
źródło
xmlns
tak:xmlns:local="clr-namespace:MyCompany.Testbench"
i taki spust<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Nie, pojawia się błądCannot find the type 'PingStatus'
.enum PingStatus
jest zdefiniowana w klasieMyCompany.TestBench.ConfigurationViewModel
. Czy muszę gdzieś dodać nazwę klasy?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Kompletny działający przykład dla WPF + MVVM.
Testowane na MSVC 2017.
W widoku:
W przypadku korzystania z ReSharper, a jeżeli DataContext jest ustawiony prawidłowo, nie będzie intellisense gdy trafisz
.
poStatusIcon
, czyli pokaże właściwości wyliczenia, które sąDebug
,Info
,Warning
lubError
.Jeśli używasz ReSharper, zasugeruje następującą aktualizację przestrzeni nazw w nagłówku pliku XAML (tak dobrze):
Oraz VieModel:
Używamy również
Fody
do automatycznego wiązania.źródło