2016-06-06 3 views
0

У меня есть вопрос относительно привязки 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

+1

Я считаю, что минимальный код поможет нам вам помочь. http://stackoverflow.com/help/mcve – tgpdyk

ответ

0

меня получить ответ от поддержки DevExpress, и это работает меня.

«Изучив его, я обнаружил, что это происходит из-за синхронизации внутреннего редактора. Когда редактор теряет источник своих элементов из-за изменения сфокусированной строки в дереве, он сбрасывает свои свойства, такие как EditValue, Text, SelectedItem , и т. д.

Чтобы предотвратить синхронизацию этих свойств, установите для свойства свойства AllowUpdateTwoWayBoundPropertiesOnSynchronization значение false. "

Смежные вопросы