C# 在XAML中绑定组合框的SelectedItem和ItemsSource时,设置组合框的SelectionChanged事件
我试图设置一个组合框,其选项从字符串列表绑定,其默认选定值从设置绑定,其选择的事件处理程序已更改 我想使用XAML对其进行如下配置:C# 在XAML中绑定组合框的SelectedItem和ItemsSource时,设置组合框的SelectionChanged事件,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我试图设置一个组合框,其选项从字符串列表绑定,其默认选定值从设置绑定,其选择的事件处理程序已更改 我想使用XAML对其进行如下配置: <ComboBox Name="RoutesComboBox" ItemsSource="{Binding Routes}" SelectedItem="{Binding DefaultRoute}" SelectionChanged="RouteFilter_Se
<ComboBox Name="RoutesComboBox"
ItemsSource="{Binding Routes}"
SelectedItem="{Binding DefaultRoute}"
SelectionChanged="RouteFilter_SelectionChanged" />
用这个C#:
这是可以的,但它相当庞大,而且可能比我可以通过编程指定SelectionChanged
事件时所做的工作要多
如果可能的话,我想使用XAML来完成这一切,因为我有很多这样的组合框,在C#中这样初始化它们看起来很糟糕
有什么想法吗?当用户更改其选择时,您不打算更新项目,为什么要绑定
SelectedItem
?不确定您的事件处理程序正在做什么,但我有一个工作解决方案,正是您想要的方式
简而言之,您需要使用支持字段跟踪DefaultRoute
。此外,当视图模型中的选定项发生更改时,您需要通知UI;顺便说一句,这是你似乎没有做的事,MVVM。如果计划以某种方式更新视图,则只应挂接到“选择已更改”事件。所有其他更改都应在视图模型中处理DefaultRoute
setter
XAML
代码
public分部类主窗口:窗口,INotifyPropertyChanged
{
公共可数路线
{
得到
{
返回新字符串[]{“a”、“b”、“c”、“d”};
}
}
公共字符串DefaultRoute
{
得到
{
返回默认路径;
}
设置
{
_defaultRoute=值;
//当选择更改时,在此处处理保存/存储设置
//MySettings.Default.DefaultRoute=值;
NotifyPropertyChanged();
}
}
公共主窗口()
{
this.DataContext=this;
初始化组件();
DefaultRoute=MySettings.Default.DefaultRoute;
}
私有字符串_defaultRoute;
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged([CallerMemberName]字符串propertyName=”“)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
私有无效路由过滤器\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
}
}
公共静态类MySettings
{
公共静态类默认值
{
公共静态字符串DefaultRoute=“a”;
}
}
Wow!你搞定了,谢谢。为了回答您的问题,我不希望用户只是更改上次选择的路线来更改默认路线。这还解决了我手动执行的另一件事,即保持不同组合框中的选定项与相同项同步。正如您所看到的,我不熟悉MVVM和绑定。再次感谢。
<ComboBox Name="RoutesComboBox"
ItemsSource="{Binding Routes}"
SelectedItem="{Binding DefaultRoute}" />
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;
}
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();
}
}
}
<ComboBox Name="RoutesComboBox"
ItemsSource="{Binding Routes}"
SelectedItem="{Binding DefaultRoute}"
SelectionChanged="RouteFilter_SelectionChanged" />
public partial class MainWindow : Window, INotifyPropertyChanged
{
public IEnumerable<string> Routes
{
get
{
return new string[] { "a", "b", "c", "d" };
}
}
public string DefaultRoute
{
get
{
return _defaultRoute;
}
set
{
_defaultRoute = value;
// Handle saving/storing setting here, when selection has changed
//MySettings.Default.DefaultRoute = value;
NotifyPropertyChanged();
}
}
public MainWindow()
{
this.DataContext = this;
InitializeComponent();
DefaultRoute = MySettings.Default.DefaultRoute;
}
private string _defaultRoute;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void RouteFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
public static class MySettings
{
public static class Default
{
public static string DefaultRoute = "a";
}
}