XAML ComboBox SelectedItem未使用x:Bind设置

esbemjvw  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我试图弄清楚为什么我不能在我的ComboBox上设置初始值SelectedItem,如果我绑定ItemsSource="{x:Bind [source]}"
这个xaml可以工作

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

字符串
但是当我更改为下面的xaml时,ComboBox包含了站点,但没有将SelectedItem显示为默认值(实际上,它似乎 Flink 到视图中,然后消失)。

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


下面是ViewModel中的相关代码(我缩短了长的Sites列表)。

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

4sup72z8

4sup72z81#

问题似乎与您未显示的代码有关。
如果我像这样创建一个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:BindBinding之间的差异。
对于x:Bind,绑定路径的根是具有绑定的控件所在的页面。
对于Binding,绑定路径的根是控件所在页面的DataContext
如果你确实需要使用两者的组合,那么在页面构造函数中设置this.DataContext = this;,使它们都指向同一个对象。

nfg76nw0

nfg76nw02#

为什么要在Sites属性的getter中创建一个新的List<string>
尝试只创建源集合 * 一次 *:

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

字符串

相关问题