Combobox SelectedItem未使用X:bind设置



我试图弄清为什么如果我与 ItemsSource="{x:Bind [source]}"绑定,我无法在COMOBOX上设置初始SelectedItem值。
这个XAML工作

<ComboBox 
        ItemsSource="{Binding Sites, Mode=OneWay}"
        SelectedItem="{x:Bind ViewModel.SelectedContractSite, Mode=TwoWay}"/> 

但是,当我更改为以下XAML时,ComboBox包含这些站点,但并未将SelectedItem显示为默认设置。(实际上,它似乎闪烁着视线,然后消失)。

<ComboBox 
        ItemsSource="{x:Bind ViewModel.Sites, Mode=OneWay}"
        SelectedItem="{x:Bind ViewModel.SelectedContractSite, Mode=TwoWay}"/>

这是ViewModel中的相关代码。(我缩写了长站点列表。)

public List<string> Sites
{
    get
    {
        return new List<string>()
        {                
            "Miami",                
            "Texas"
        };
    }
}
private string _selectedContractSite = "Texas";
public string SelectedContractSite
{
    get
    {
        return _selectedContractSite;
    }
    set
    {
        Set(ref _selectedContractSite, value);
    }
}

感谢您的帮助!

该问题似乎与您尚未显示的代码有关。(有关将来的参考,请参阅https://stackoverflow.com/help/mcve,以删除回答未来问题的猜测。)

如果我创建一个像这样的ViewModel

public class ViewModel : INotifyPropertyChanged
{
    public List<string> Sites
    {
        get
        {
            return new List<string>()
            {
                "Miami",
                "Texas"
            };
        }
    }
    private string _selectedContractSite = "Texas";
    public string SelectedContractSite
    {
        get
        {
            return _selectedContractSite;
        }
        set
        {
            if (_selectedContractSite != value)
            {
                _selectedContractSite = value;
                OnPropertyChanged(nameof(SelectedContractSite));
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后以这样的方式设置CodeBehind:

    public MainPage()
    {
        this.InitializeComponent();
        this.ViewModel = new ViewModel();
    }
    public ViewModel ViewModel { get; set; }

然后以下XAML按预期工作

<ComboBox ItemsSource="{x:Bind ViewModel.Sites, Mode=OneWay}"
          SelectedItem="{x:Bind ViewModel.SelectedContractSite, Mode=TwoWay}" />

注意。我正在使用x:Bind并在两个绑定路径中引用ViewModel。

我怀疑您的困惑在于x:BindBinding之间的差异。
使用x:Bind,绑定路径的根是绑定的控件的页面。
使用Binding,绑定路径的根是控件为ON的页面的DataContext
混合两者会感到困惑。如果您确实需要使用两者的组合,则在页面构造函数中设置this.DataContext = this;,以便它们都指向同一件事。

为什么在Sites属性的Getter中创建新的List<string>

尝试仅创建源集合一次

public List<string> Sites { get; } = new List<string>() { "Miami", "Texas" };

最新更新