ComboBox SelectedItem 未使用 x:Bind 设置

问题描述 投票:0回答:2

我试图弄清楚为什么如果我与

SelectedItem
绑定,我无法在组合框中设置初始
ItemsSource="{x:Bind [source]}"
值。
这个 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);
    }
}
c# xaml combobox uwp uwp-xaml
2个回答
3
投票

该问题似乎与您未显示的代码有关。

如果我创建一个像这样的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));
    }
}

然后像这样设置隐藏代码:

    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:Bind
Binding
之间的差异。
对于
x:Bind
,绑定路径的根是具有绑定的控件所在的页面。
对于
Binding
,绑定路径的根是控件所在页面的
DataContext

混合两者可能会造成混乱。如果您确实需要使用两者的组合,请在页面构造函数中设置
this.DataContext = this;
,以便它们都指向同一对象。


0
投票

为什么要在

List<string>
属性的 getter 中创建一个新的
Sites

尝试仅创建源集合一次

public List<string> Sites { get; } = new List<string>() { "Miami", "Texas" };
© www.soinside.com 2019 - 2024. All rights reserved.