IValueConverter.Convert не вызывается при привязке OneWay - PullRequest
3 голосов
/ 06 апреля 2011

У меня есть логическое свойство (оно называется INotifyPropertyChanged в установщике), которое связано со свойством button.IsEnabled в моем XAML.В настоящее время я использую привязку TwoWay, но это вызывает проблемы, и мне нужна только привязка OneWay.Моя проблема в том, что используемый конвертер не вызывается после первого запуска программы.Я установил точки останова в установщике, и он вызывается load, но метод Convert() вообще не вызывается.Почему это так?

Какой-то код:

public bool IsSaving
    {
        get
        {
            return _isSaving;
        }
        set
        {
            _isSaving = value;
            NotifyOfPropertyChange(() => IsSaving);
        }
    }

и XAML:

IsEnabled="{Binding Path=IsSaving, Mode=OneWay, Converter={StaticResource booleanToNotEnabledConverter}}"

Преобразователь действительно просто возвращает !(bool)value, поэтому кнопка отключается, когда IsSaving верно.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2011

Некоторые изменения во время выполнения могут привести к разрыву привязки (поскольку вы привязываете к DataContext + относительный путь), если вы используете Visual Studio, обязательно проверьте окно вывода на наличие ошибок привязки.

Редактировать: Поскольку не было отмечено: это стандартная привязка, и в опубликованном коде нет ничего плохого, проблема должна быть вызвана контекстом.

1 голос
/ 06 апреля 2011

Вот код, который я использовал, и это работает:

Преобразователь:

using System.Windows.Data;
using System;
namespace SilverlightApplication1
{
    public class BooleanToNotEnabledConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return !(bool)value;
        }

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

XAML:

<UserControl x:Class="SilverlightApplication1.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:SilverlightApplication1"
             mc:Ignorable="d"
             d:DesignHeight="300"
             d:DesignWidth="400">
    <UserControl.Resources>
        <local:BooleanToNotEnabledConverter x:Key="booleanToNotEnabledConverter" />
    </UserControl.Resources>
    <StackPanel Margin="100">

        <Button Content="Flip"
                Click="Button_Click" />
        <TextBlock Text="{Binding IsSaving}"
                   Height="20" />
        <Button IsEnabled="{Binding IsSaving, Mode=OneWay, Converter={StaticResource booleanToNotEnabledConverter}}"
                Content="Some Button" />
    </StackPanel>
</UserControl>

Код позади:

using System.Windows.Controls;
using System.Windows;
using System.ComponentModel;
namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        private Data _data;
        public MainPage()
        {
            InitializeComponent();
            _data = new Data { IsSaving = true };
            this.DataContext = _data;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            _data.IsSaving = !_data.IsSaving;
        }
    }

    public class Data : INotifyPropertyChanged
    {
        #region IsSaving Property
        private bool _isSaving;
        public bool IsSaving
        {
            get
            {
                return _isSaving;
            }
            set
            {
                if (_isSaving != value)
                {
                    _isSaving = value;
                    OnPropertyChanged("IsSaving");
                }
            }
        }
        #endregion

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            var p = PropertyChanged;
            if (p != null)
            {
                p(this, new PropertyChangedEventArgs(propertyName));

            }
        }
    }
}
0 голосов
/ 06 апреля 2011

Вы уверены, что вызываете обработчик события PropertyChanged с правильной строкой?

PropertyChanged.Invoke(this, new PropertyChangedEventArgs("IsSaving"));
...