WPF MultiBinding Ausfällt. Warum?

Habe ich dieses Markup:

   <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>

In der code-behind habe ich diese Zeile in den window_loaded-Methode:

DataContext = uiManager;

uiManager ist der Typ UIManager, hat zwei öffentliche Eigenschaften mit den Namen IsConnected und IsLoggedIn.

Dieser code schlägt fehl, beim Start, weil die Werte-array in den Konverter, das heißt durch die Multibinding ist nicht gefüllt mit booleans, haben aber einen Wert von DependencyProperty.UnsetValue.

Wenn ich den markup unten (und ändern Sie den returntype von dem Konverter) funktioniert es.

   <GroupBox BorderThickness="2">
    <GroupBox.BorderBrush>
         <MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
              <Binding Path="IsConnected"/>
              <Binding Path="IsLoggedIn"/>
         </MultiBinding>
    </GroupBox.BorderBrush>

Es scheint, dass die Bindung durch den DataContext in der code-behind scheitert im ersten Beispiel, funktioniert aber in der zweiten. Warum?

Vollständigkeit unterhalb der UIManager-Klasse:

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
    }

BEARBEITEN:
Die Umwandlung Methode, die für die fehlerhafte XAML (es scheitert an der Konvertierung zu bool Werte[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;
        }

für die arbeiten 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;
        }
Können Sie fügen Sie den code für Ihre Software? Was ist falsch mit der Einstellung der GroupBox auf ein Pinsel-anstatt des SolidColorBrush.Color-Eigenschaft?
Ich habe den Konverter-Methode. Ich muss setzen Sie die Farbe-Eigenschaft, um in der Lage sein zu implementieren ColorAninmation. Das ist an sich funktioniert mit dem ersten XAML, wenn ich entfernen Sie die MultiBinding.

InformationsquelleAutor Dabblernl | 2009-09-18

Schreibe einen Kommentar