Je cette Markup:WPF MultiBinding échoue. Pourquoi?
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<SolidColorBrush x:Name="Border">
<SolidColorBrush.Color>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</SolidColorBrush.Color>
</SolidColorBrush>
</GroupBox.BorderBrush>
Dans le code derrière je cette ligne dans la méthode Window_Loaded:
DataContext = uiManager;
UIManager est de type UIManager qui a deux propriétés publiques nommées IsConnected et IsLoggedIn.
Ce code échoue au démarrage car le tableau de valeurs dans le convertisseur appelé par Multibinding n'est pas rempli avec des booléens mais avec la valeur DependencyProperty.UnsetValue. Lorsque j'utilise le balisage ci-dessous (et change le type de retour du convertisseur), cela fonctionne.
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</GroupBox.BorderBrush>
Il semble que l'ensemble de liaison à travers le DataContext dans le code ne derrière dans le premier exemple, mais travaille dans le second. Pourquoi?
Pour être complet au-dessous de la classe UIManager:
public class UIManager:IUIManager
{
#region Implementation of IUIManager
private const string IsLoggedInProperty = "IsLoggedIn";
private bool loggedIn;
private readonly object loggedInLock = new object();
public bool IsLoggedIn
{
get
{
lock (loggedInLock)
{
return loggedIn;
}
}
set
{
lock (loggedInLock)
{
if(value==loggedIn)return;
loggedIn = value;
OnPropertyChanged(IsLoggedInProperty);
}
}
}
private void OnPropertyChanged(string property)
{
if(PropertyChanged!=null)PropertyChanged(this,new PropertyChangedEventArgs(property));
}
private const string IsConnectedProperty = "IsConnected";
private bool isConnected;
private object isConnectedLock = new object();
public bool IsConnected
{
get
{
lock (isConnectedLock)
{
return isConnected;
}
}
set
{
lock (isConnectedLock)
{
if(value==isConnected)return;
isConnected = value;
OnPropertyChanged(IsConnectedProperty);
}
}
}
#endregion
#region Implementation of INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
EDIT: Le procédé de conversion de l'XAML défaut (il ne parvient pas à la conversion à bool de valeurs [0]:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var is_connected = (bool) values[0];
var is_loggedin = (bool) values[1];
return is_loggedin
? is_connected
? Colors.YellowGreen
: Colors.Red
: Colors.Gray;
}
pour le fonctionnement XAML:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var is_connected = (bool) values[0];
var is_loggedin = (bool) values[1];
return is_loggedin
? is_connected
? Brushes.YellowGreen
: Brushes.Red
: Brushes.Gray;
}
Pouvez-vous également joindre le code de votre convertisseur? Quel est le problème avec la définition de GroupBox à un pinceau au lieu de la propriété SolidColorBrush.Color? – bendewey
J'ai ajouté la méthode du convertisseur. J'ai besoin d'exposer la propriété Color pour pouvoir implémenter une ColorAninmation. Cela fonctionne en soi avec le premier XAML lorsque je supprime le MultiBinding. – Dabblernl