繁体   English   中英

ComboBox SelectedItem未设置为x:Bind

[英]ComboBox SelectedItem not set with x:Bind

我试图找出为什么我不能在我的ComboBox上设置初始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);
    }
}

谢谢您的帮助!

该问题似乎与您未显示的代码有关。 (供将来参考,请参阅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));
    }
}

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

    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在两个绑定路径中x:Bind并引用ViewModel。

我怀疑你的困惑在于x:BindBinding之间的区别。
使用x:Bind绑定路径的根是绑定控件的页面。
使用Binding绑定路径的根是控件所在页面的DataContext
混合两者可能会让人感到困惑。 如果你确实需要使用两者的组合,那么设置this.DataContext = this; 在页面构造函数中,所以它们都指向同一个东西。

为什么要在Sites属性的getter中创建一个新的List<string>

尝试仅创建一次源集合:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM