我有一个关于使用主从细节布局的WPF绑定的问题。
主视图包含带有TreeListView的DevExpress GridControl。 更改TreeListView选定项目时(通过绑定)更新详细视图内容。 详细视图只包含一个ContentControl,其Content属性绑定到TreeListView的当前所选项。 为了以与所选项的类型相对应的方式显示详细视图,将多个DataTemplates注册到当前应用程序资源。 就我而言,DataTemplates只是一个用户控件。
当在主视图TreeListView中更改选择时,相应的DataTemplate被正确地显示。
我的一个详细视图包含一个DevExpress ListBoxEdit。 SelectedIndex与UpdateSourceTrigger = PropertyChanged绑定。
我的问题是,当在主视图中选择另一个项目时,将使用值-1调用bound属性的setter。 当控件被卸载或处理或解除绑定时,似乎接收到-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);
}
非常感谢你 菲利普
答案 0 :(得分:0)
我收到了DevExpress支持的回复,这对我有用。
“研究过后,我发现由于内部编辑器的同步而发生这种情况。当编辑器因为更改树中的焦点行而丢失其项目源时,它会重置其属性,如EditValue,Text,SelectedItem,等
要防止同步这些属性,请将编辑器的 AllowUpdateTwoWayBoundPropertiesOnSynchronization 属性设置为false。“