c# - ComboBox SelectedItem 未设置 x :Bind

标签 c# xaml combobox uwp uwp-xaml

如果我使用 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 以消除在回答 future 问题时的猜​​测。)

如果我像这样创建一个 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 并在两个绑定(bind)路径中引用 ViewModel。

我怀疑您的困惑在于 x:BindBinding 之间的区别。
对于 x:Bind,绑定(bind)路径的根是带有绑定(bind)的控件所在的页面。
对于 Binding,绑定(bind)路径的根是控件所在页面的 DataContext
将两者混合在一起会让人感到困惑。如果您确实需要使用两者的组合,请在页面构造函数中设置 this.DataContext = this;,以便它们都指向同一事物。

关于c# - ComboBox SelectedItem 未设置 x :Bind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815156/

相关文章:

c# - 如何在 Visual Studio 2015 RC 中启用 Intellitest?

c# - 使用 XSL 将 XML 转换为 XAML

wpf - 如何创建一个带有渐变wpf的弯曲边的盒子

C# 将 mySQL 结果添加到组合框

c# - Windows Form ComboBox 在应用程序失去焦点时触发 SelectionChangeCommitted、SelectedValueChanged 和 SelectedIndexChanged 事件

c# - Android:将变量设置为微调项供以后使用

c# - char 对象对应于哪个字符编码(Unicode 版本)集?

c# - 使用 C# 查询 MongoDB 嵌套数组文档

c# - XAML 等效于 HTML 标题属性

c# - WPF,访问组合框选择的项目