【发布时间】:2015-09-30 16:49:50
【问题描述】:
我正在尝试设置一个 ComboBox,其选项绑定自字符串列表,其默认选择值绑定自设置,并且其选择的事件处理程序已更改。
我想像这样使用 XAML 来配置它:
<ComboBox Name="RoutesComboBox"
ItemsSource="{Binding Routes}"
SelectedItem="{Binding DefaultRoute}"
SelectionChanged="RouteFilter_SelectionChanged" />
但是当我在启动时这样做时会抛出错误:
未处理的类型异常 'System.Reflection.TargetInvocationException' 发生在 PresentationFramework.dll
如果我只在 XAML 中执行其中一些操作,则可以在 C# 中以编程方式设置 SelectionChanged 事件或 ItemsSource,如下所示,它可以正常工作。但是我有很多这样的组合框,所以我宁愿直接在 XAML 中进行。
<ComboBox Name="RoutesComboBox"
ItemsSource="{Binding Routes}"
SelectedItem="{Binding DefaultRoute}" />
使用这个 C#:
public IEnumerable<string> Routes
{
get { return LubricationDatabase.GetRoutes(); }
}
public string DefaultRoute
{
get { return MySettings.Default.DefaultRoute; }
set { } /* side question: without this, it throws a parse exception. Any idea why? */
}
public MainWindow()
{
this.DataContext = this;
InitializeComponent();
RoutesComboBox.SelectionChanged += RouteFilter_SelectionChanged;
}
我也试过here找到的解决方案:
private string _defaultRoute;
public string DefaultRoute
{
get { return MySettings.Default.DefaultRoute; }
set
{
if (_defaultRoute != value)
{
_defaultRoute = value;
// this fires before `SelectedValue` has been
// updated, and the handler function uses that,
// so I manually set it here.
RoutesComboBox.SelectedValue = value;
SelectionChangedHandler();
}
}
}
这没关系,但是当我可以以编程方式分配 SelectionChanged 事件时,它相当庞大并且可能比值得做的工作更多。
如果可能的话,我想再次使用 XAML 来完成这一切,因为我有很多这样的 ComboBox,并且在 C# 中像这样初始化它们看起来很糟糕。
有什么想法吗?
【问题讨论】:
标签: c# wpf xaml mvvm data-binding