Конвертер не подключен к событию PropertyChanged - PullRequest
0 голосов
/ 10 мая 2018

У меня есть это древовидное представление с иерархией, связанной с моделью структуры сущности. Прямоугольник ниже работает только для начальной загрузки. И не обновляет свой цвет и т. Д., Когда я запускаю событие Propertyaged.

<HierarchicalDataTemplate ItemsSource="{Binding tblLines}">
    <StackPanel Orientation="Horizontal" Margin="2">
        <Image Height="15" Margin="4" x:Name="imgTreeProject" Source="/DES STUDIO PR;component/Resources/Images/folder_closed.png"/>
        <TextBlock Text="{Binding Name}" Margin ="8" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        <Rectangle Name="X" Width="10" Height="10" Fill="{Binding Path=.,Converter={StaticResource CheckoutConverter},UpdateSourceTrigger=PropertyChanged}" ToolTip="{Binding Path=.,Converter={StaticResource CheckoutPersonConverter},UpdateSourceTrigger=PropertyChanged}" ToolTipService.IsEnabled="{Binding Path=.,Converter={StaticResource CheckoutToolTipVis},UpdateSourceTrigger=PropertyChanged}"/>
    </StackPanel>

Вот мои конвертеры:

public class CheckoutConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is TblBase)
        {
            var Baseentity = value as TblBase;

            if (Baseentity.COID == MainWindow.LocalUser.ID)
            {
                return Brushes.Green;
            }
            else if ((Baseentity.COID == 0) || (Baseentity.COID == null))
            {
                return Brushes.Transparent;
            }
            else if (Baseentity.COID != 0)
            {
                return Brushes.Black;
            }
        }
        return Brushes.Black;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public class CheckoutPersonConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is TblBase)
        {
            var Baseentity = value as TblBase;
            //COID equals other user's ID

            if ((Baseentity.COID != 0) && (Baseentity.COID != null) && (Baseentity.COID != MainWindow.LocalUser.ID))
            {
               var user = DESDatabase.GetUser(Baseentity.COID.Value);
               return "Checked out by " + user;
            }
            else if (Baseentity.COID == MainWindow.LocalUser.ID)
                return "You have this node checked out.";
            else
                return "error";
        }
        return "error";
    }

    public  object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public class CheckoutToolTipVis : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is TblBase)
        {
            var Baseentity = value as TblBase;
            //COID equals other user's ID

            if ((Baseentity.COID != 0) && (Baseentity.COID != null))
            {
                return true;
            }
            else
                return false;
        }
        return true;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

И событие, изменившее мою собственность, здесь вызывается:

private Nullable<int> _coid;
public Nullable<int> COID
{
    get
    {
        NotifyPropertyChanged();
        return _coid;
    }
    set
    {
        _coid = value;
        NotifyPropertyChanged();
    }
}

События измененного свойства работают для привязок в виде дерева, которые не используют конвертеры, поэтому я не уверен, что мне не хватает.

1 Ответ

0 голосов
/ 10 мая 2018

конвертеры (IValueConverter) не подписываются на событие PropertyChanged, это ответственность связывания.

В настоящее время преобразователь используется с привязкой ко всему объекту, а не к свойству:

Fill="{Binding Path=.,Converter={StaticResource CheckoutConverter},UpdateSourceTrigger=PropertyChanged}"

, поэтому обновления COID происходят незамеченными.

вам необходимо изменитьделать ставки на

Fill="{Binding Path=COID,Converter={StaticResource CheckoutConverter},UpdateSourceTrigger=PropertyChanged}"

и также менять конвертер:

public class CheckoutConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is int?)
        {
            var COID = value as int?;

            if (COID == MainWindow.LocalUser.ID)
            {
                return Brushes.Green;
            }
            else if ((COID == 0) || (COID == null))
            {
                return Brushes.Transparent;
            }
            else if (COID != 0)
            {
                return Brushes.Black;
            }
        }
        return Brushes.Black;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...