我试图弄清楚为什么如果我与
SelectedItem
绑定,我无法在组合框中设置初始 ItemsSource="{x:Bind [source]}"
值。<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);
}
}
该问题似乎与您未显示的代码有关。
如果我创建一个像这样的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;
,以便它们都指向同一对象。
为什么要在
List<string>
属性的 getter 中创建一个新的 Sites
?
尝试仅创建源集合一次:
public List<string> Sites { get; } = new List<string>() { "Miami", "Texas" };