wpf TemplateSelector.SelectTemplate不会在PropertyChange时触发

tzdcorbm  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一些数据,可以通过不同的报告进行可视化。每个报表都有不同的属性...我创建了一个对话框,用一个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。
我错过了什么?

i2byvkas

i2byvkas1#

我错过了什么?
声明

CurStatistics.ReportType = (ReportType)rt.Id;

不会更改CurStatistics属性的值,因此不会触发绑定

Content="{Binding CurStatistics}"

您可以为CurStatistics属性分配一个新值(并确保它触发PropertyChanged事件),也可以在Content属性上使用MultiBinding。

相关问题