C# 组合框SelectedItem未使用x:Bind设置

C# 组合框SelectedItem未使用x:Bind设置,c#,xaml,combobox,uwp,uwp-xaml,C#,Xaml,Combobox,Uwp,Uwp Xaml,我正在试图弄清楚,如果使用ItemsSource=“{x:bind[source]}”绑定,为什么不能在组合框上设置初始SelectedItem值 这个xaml有效 <ComboBox ItemsSource="{Binding Sites, Mode=OneWay}" SelectedItem="{x:Bind ViewModel.SelectedContractSite, Mode=TwoWay}"/> 但是,当我更改为以下xaml时,组

我正在试图弄清楚,如果使用
ItemsSource=“{x:bind[source]}”绑定,为什么不能在组合框上设置初始
SelectedItem

这个xaml有效

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

但是,当我更改为以下xaml时,组合框包含站点,但不会将SelectedItem显示为默认值。(事实上,它似乎在视图中闪烁,然后消失)


以下是ViewModel中的相关代码。(我简化了长长的站点列表。)

公共列表站点
{
得到
{
返回新列表()
{                
“迈阿密”,
“德克萨斯州”
};
}
}
私有字符串_selectedContractSite=“Texas”;
公共字符串SelectedContractSite
{
得到
{
返回所选合同地点;
}
设置
{
设置(参考所选合同地点、值);
}
}

谢谢你的帮助

问题似乎与您未显示的代码有关。(如需将来参考,请参阅在回答未来问题时消除猜测。)

如果我创建这样的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));
    }
}
然后,下面的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,因此它们都指向同一事物。

为什么要在
站点
属性的getter中创建新的
列表

尝试仅创建一次源集合:

publicslist站点{get;}=newlist(){“迈阿密”,“德克萨斯州”};

尝试
SelectedItem=“{x:Bind SelectedContractSite,Mode=TwoWay}”
。我的假设是,
ViewModel
总是被指定为
ItemsSource
,因此它应该只是任何
ItemsBinding
的属性。再说一遍,这只是一个假设。@AVKNaidu,谢谢你的建议,但没有用。没有包含ViewModel,绑定路径无法解析。我正在用确切的解释和示例编写我的答案+谢谢。我会挖得更深。您编写的代码似乎与我的代码完全相同,但其中一些代码(设置ViewModel,实现INotifyPropertyChanged)被包装在Template10框架中,因此细节可能是关键。
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; }
<ComboBox ItemsSource="{x:Bind ViewModel.Sites, Mode=OneWay}"
          SelectedItem="{x:Bind ViewModel.SelectedContractSite, Mode=TwoWay}" />
public List<string> Sites { get; } = new List<string>() { "Miami", "Texas" };