В следующем коде я ожидаю, что поле со списком вернется к исходному Selected_Item, однако это не так, поле со списком в окне всегда показывает любой новый элемент, который я выбираю (и не синхронизируется с моделью), я также пытался всегда вызывать OnPropertyChanged ("Выбранный_элемент"); независимо от того, является ли значение другим, и все же поле со списком показывает только что выбранный элемент и не синхронизируется. Скорее всего, я делаю это неправильно, но как быть правильным?
namespace WpfApplication8
{
public class Context : INotifyPropertyChanged
{
#region Privates
bool c_Disabled = false;
#endregion
#region Ctors
public Context()
{
Items = new List<MyItem>();
Items.Add(new MyItem("Item 1"));
Items.Add(new MyItem("Item 2"));
Items.Add(new MyItem("Item 3"));
Selected_Item = Items[0];
c_Disabled = true;
}
#endregion
#region Properties
public List<MyItem> Items
{
get;
private set;
}
private MyItem c_Selected_Item;
public MyItem Selected_Item
{
get { return c_Selected_Item; }
set
{
if (c_Selected_Item != value)
{
if (!c_Disabled)
{
c_Selected_Item = value;
OnPropertyChanged("Selected_Item");
}
}
}
}
#endregion
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string f_Prop_Name)
{
PropertyChangedEventHandler l_Handler = PropertyChanged;
if (null != l_Handler)
{
l_Handler(this, new PropertyChangedEventArgs(f_Prop_Name));
}
}
#endregion
}
public class MyItem
{
public MyItem(string f_Name)
{
Name = f_Name;
}
public string Name {get;set;}
}
}
и следующее окно:
<Window x:Class = "WpfApplication8.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "525">
<Grid>
<ComboBox
HorizontalAlignment = "Center"
VerticalAlignment = "Top"
ItemsSource = "{Binding Items}"
SelectedItem = "{Binding Selected_Item}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text = "{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</Window>
Ваша проблема не ясна. Очевидно, что ваше условие if всегда верно. Может быть, если вы четко сформулируете свое требование, люди смогут подсказать вам, в чем вы ошиблись.
Установщик Selected_Item не может предотвратить изменение SelectedItem ComboBox, даже если он не установил свое поле поддержки. Пока привязка не переоценивается, ничего не происходит.
@Jammer Нет, это не всегда правда
Я думаю, что вам нужны DependencyProperty и Coerce Value Callbacks для решения вашей проблемы. Пожалуйста, проверьте эту ссылку: stackoverflow.com/questions/30379687/…
Я хочу НЕ обновлять выбор из внешнего мира (то есть из представления, отключив назначение), однако даже если Selected_Item в модели не изменяется, View полностью игнорирует это и по-прежнему придерживается любого выбора, который пользователь делает из пользовательский интерфейс.
«Представление полностью игнорирует это» - конечно, потому что ваше предположение о том, как работают привязки, неверно.
@Clemens, спасибо, я подумал, что теперь это кусок документа, из которого я должен был сделать вывод, что мое «предположение о том, как работают привязки», неверно?
Вы предполагаете, что после того, как Binding установит значение исходного свойства, оно автоматически получит фактическое значение обратно из своего исходного свойства. Что заставляет вас думать так?
@Clemens, нет, я предполагаю, что это не работает, потому что я сказал [quote] я также пытался всегда вызывать OnPropertyChanged ("Selected_Item") [/ quote]. Это означает, что даже если я перезапущу обновление свойства, когда набор игнорируется, пользовательский интерфейс игнорирует его.





Удалите c_Disabled = true; из метода контекста;
c_Disabled всегда верно.