Привязки к ContentControl не обновляют данные

У меня есть код:

<TextBox Width="200" Text="{Binding Value}"></TextBox>

Который работает. Однако «Значение» может быть разных типов. Поэтому, если у меня есть логическое значение, я хочу показать флажок. Я переписал это следующим образом, что вроде работает:

<ContentControl Content="{Binding Value}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type sys:Boolean}">
            <CheckBox IsChecked="{Binding Path=.}"></CheckBox>
        </DataTemplate>
        <DataTemplate DataType="{x:Type sys:Double}">
            <TextBox Width="200" Text="{Binding Path=.}"></TextBox>
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>

Но теперь свойство не обновляется, как раньше. Я попытался установить Mode=Twoway, но это все равно не работает.

Изменить

Это работало отлично, когда у меня было только текстовое поле, редактирование текста текстового поля обновляло модель. Однако, когда я попытался сделать это со вторым кодом (ContentControl), это просто не сработало.

Код

Я использую Mvvm-light вместе с привязками. «Значение» привязано к экземпляру свойства

    [JsonObject]
    public class Property<T> : INotifyPropertyChanged
    {
        [JsonProperty]
        public String name;

        public Property(String name, T value)
        {
            this._value = value;
            this.name = name;
        }

        [JsonIgnore]
        public T Value {
            get { return _value; }
            set {
                _value = value;
                hot = true;
                NotifyPropertyChanged("Value");
            }
        }

        [JsonProperty(PropertyName = "value")]
        private T _value;

        [JsonIgnore]
        public String Name { get { return name; } set { name = value; } }

        [JsonProperty]
        public bool hot = false;

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

person Knarf    schedule 13.11.2014    source источник


Ответы (1)


Вы должны реализовать интерфейс INotifyPropertyChanged, чтобы отслеживать изменения свойств. Я уверен, что тогда все работает нормально.

Это работает для меня:

 public partial class MainWindow : Window, INotifyPropertyChanged
{
    private object value;        

    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
        DataContext = this;
    }

    public object Value
    {
        get { return value; }
        set
        {                
            this.value = value;
            NotifyPropertyChanged("Value");
        }
    }       

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Value = true;            
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
person Abdurrahman Alp Köken    schedule 13.11.2014
comment
Это работало отлично, когда у меня было только текстовое поле, редактирование текста текстового поля обновляло модель. Однако, когда я попытался сделать это со вторым кодом (ContentControl), это просто не сработало. - person Knarf; 13.11.2014
comment
Не могли бы вы поделиться своим кодом? Особенно определение свойств. - person Abdurrahman Alp Köken; 13.11.2014