У меня есть вопрос относительно привязки WPF с использованием макета главной детали.WPF-привязка с макетным макетом
Главный вид содержит DevExpress GridControl с TreeListView. Содержимое подробного представления обновляется при изменении выбранного элемента TreeListView (через привязку). Детальный вид содержит только ContentControl, а его свойство Content привязано к текущему выбранному элементу TreeListView. Чтобы отобразить подробный вид таким образом, который соответствует типу выбранного элемента, несколько DataTemplates регистрируются в текущих ресурсах приложения. В моем случае DataTemplates - это всего лишь один пользовательский элемент управления.
Когда выбор изменен в основном представлении TreeListView, соответствующий DataTemplate соответствующим образом дублируется.
Один из моих подробных представлений содержит DevExpress ListBoxEdit. Выделение SelectedIndex связано с UpdateSourceTrigger = PropertyChanged.
Моя проблема в том, что сеттер связанного свойства вызывается со значением -1, когда в главном представлении выбран другой элемент. Кажется, что значение -1 по умолчанию принимается, когда элемент управления выгружен или удален или несвязан. Это испортило мою модель взгляда.
Есть ли способ избежать уведомления в ViewModel, когда элемент управления выгружен?
[обновление] ContentControl, который содержит подробный вид определяется следующим образом:
<ContentControl Grid.Column="1" Content="{Binding CurrentApplicationSettings}" Margin="10,0,0,0"/>
В соответствующей модели представления (метод SetValue называет OnPropertyChanged):
public IApplicationSettingsViewModel CurrentApplicationSettings
{
get { return GetValue<IApplicationSettingsViewModel>(); }
set { SetValue(value); }
}
В деталях где у меня есть проблема, ListBoxEdit определяется следующим образом:
<dxe:ListBoxEdit ShowBorder="False" ItemsSource="{Binding AllLoggingLevels, Mode=OneTime}" SelectedIndex="{Binding Path=LoggingLevel, Mode=TwoWay, Converter={StaticResource LogLevelConverter}, UpdateSourceTrigger=PropertyChanged}">
<dxe:ListBoxEdit.StyleSettings>
<dxe:RadioListBoxEditStyleSettings/>
</dxe:ListBoxEdit.StyleSettings>
</dxe:ListBoxEdit>
В соответствующем ViewModel:
public LoggingLevel LoggingLevel
{
get { return GetValue<LoggingLevel>(); }
set { SetValue(value); }
}
В DataTemplates регистрируются по коду:
public void RegisterDataTemplate(DataTemplate dataTemplate)
{
object dataTemplateKey = dataTemplate.DataTemplateKey;
if (dataTemplateKey == null)
{
throw new InvalidOperationException("The data template has an invalid key");
}
System.Windows.Application.Current.Resources.Add(dataTemplateKey, dataTemplate);
}
Большое спасибо Philippe
Я считаю, что минимальный код поможет нам вам помочь. http://stackoverflow.com/help/mcve – tgpdyk