我有一些数据,可以通过不同的报告进行可视化。每个报表都有不同的属性...我创建了一个对话框,用一个ComboBox来选择报表,用一个ContentControl来显示报表类型相关的编辑控件。
对话框xaml看起来像
<StackPanel Margin="9">
<ComboBox Name="cbReport" IsEditable="False"
VerticalAlignment="Center"
ItemsSource="{Binding ReportTypes}"
SelectionChanged="OnReportTypeChanged"
SelectedValue="{Binding SelectedReportType, Mode=TwoWay}"
SelectedValuePath="Content"
DisplayMemberPath="Name"/>
<ContentControl ContentTemplateSelector="{StaticResource DialogTemplateSelector}"
Content="{Binding CurStatistics}"/>
<WrapPanel HorizontalAlignment="Right" Margin="0,9,0,0">
<Button Name="pbDialogOK" Click="OnDialogOK" MinWidth="60" Margin="0,0,9,0"
IsDefault="True">Ok</Button>
<Button Name="pbDialogCancel" IsCancel="True" MinWidth="60">Cancel</Button>
</WrapPanel>
</StackPanel>
后面的代码将Combobox-event-callback路由到ViewModel:
public partial class ReportDialog : Window
{
private void OnReportTypeChanged(object sender, SelectionChangedEventArgs e)
{
((DialogViewModel)DataContext).ChangeReportType((CBItem)e.AddedItems[0]);
}
}
ViewModel看起来像:
public class DialogViewModel : ObservableObject
{
//Statistics is an ObservableObject
public Statistics CurStatistics { get; set; }
public ObservableCollection<CBItem> ReportTypes { get; }
public CBItem SelectedReportType {
get => curReportType;
set => SetProperty(ref curReportType, value);
}
CBItem curReportType;
public void ChangeReportType(CBItem rt)
{
SelectedReportType = rt;
//vomits PropertyChange event
CurStatistics.ReportType = (ReportType)rt.Id;
}
}
如代码注解中所述,Statistics是一个ObservableObject,它在设置ReportType成员时发送PropertyChange-event。
在ChangeReportType中设置断点可验证ReportType是否正确更改。但是TemplateSelector中的断点。SelectTemplate仅在创建对话框时触发,并证明模板选择按预期工作。
但在更改组合框时,会调用ChangeReportType,但不会调用SelectTemplate。
我错过了什么?
1条答案
按热度按时间i2byvkas1#
我错过了什么?
声明
不会更改
CurStatistics
属性的值,因此不会触发绑定您可以为
CurStatistics
属性分配一个新值(并确保它触发PropertyChanged事件),也可以在Content属性上使用MultiBinding。