C# 在XAML中绑定组合框的SelectedItem和ItemsSource时,设置组合框的SelectionChanged事件

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

我试图设置一个组合框,其选项从字符串列表绑定,其默认选定值从设置绑定,其选择的事件处理程序已更改

我想使用XAML对其进行如下配置:

    <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";
    }
}