У меня есть код:
<TextBox Width="200" Text="{Binding Value}"></TextBox>
Что работает. Однако "Значение" может быть разных типов. Поэтому, если у меня есть bool, я хочу показать флажок. Я переписал его так, как следует, что работает:
<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 togheter со связями. "Значение" привязано к экземпляру Property
[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));
}
}
}
Вы должны реализовать интерфейс 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));
}
}
}