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页面构造器中的code>,因此它们都指向同一事物。为什么要在站点
属性的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" };