tengo este marcado:WPF MultiBinding Fails. ¿Por qué?
<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>
En el código detrás tengo esta línea en el método window_loaded:
DataContext = uiManager;
UIManager es de UIManager tipo que tiene dos propiedades públicas nombradas isConnected y IsLoggedIn.
Este código falla al inicio porque la matriz de valores en el convertidor que llama Multibinding no está llena de booleanos, pero tiene un valor de DependencyProperty.UnsetValue.
Cuando uso el marcado a continuación (y cambio el retornante del convertidor) funciona.
<GroupBox BorderThickness="2">
<GroupBox.BorderBrush>
<MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
<Binding Path="IsConnected"/>
<Binding Path="IsLoggedIn"/>
</MultiBinding>
</GroupBox.BorderBrush>
Parece que el conjunto de unión a través de la DataContext en el código falla atrás en el primer ejemplo, pero trabaja en el segundo. ¿Por qué?
Para completar por debajo de la clase 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: El método de conversión para el XAML no (se produce un error en la conversión a bool de valores [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;
}
para el XAML de trabajo:
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;
}
¿Puede adjuntar el código para su convertidor también? ¿Qué hay de malo en configurar GroupBox en un pincel en lugar de la propiedad SolidColorBrush.Color? – bendewey
Agregué el método del convertidor. Necesito exponer la propiedad Color para poder implementar una ColorAninmation. Esto en sí mismo funciona con el primer XAML cuando elimino el enlace múltiple. – Dabblernl