2017-03-15 88 views
1

我想弄清楚为什么我无法在我的ComboBox上设置初始SelectedItem值,如果我使用ItemsSource="{x:Bind [source]}"进行绑定。
此XAML工作ComboBox SelectedItem未设置为x:绑定

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

感谢您的帮助!

+0

尝试'的SelectedItem = “{x:绑定SelectedContractSite,模式=双向}”'。我的假设是,'ViewModel'被指定为'ItemsSource',所以它应该只是任何'ItemsBinding'的属性。再一次,只是一个假设。 – AVK

+0

@AVKNaidu,感谢您的建议,但它没有奏效。没有包含ViewModel的情况下,绑定路径无法解析。 – NSouth

回答

3

该问题似乎与您未显示的代码有关。 (供将来参考,请参阅https://stackoverflow.com/help/mcve在回答未来的问题删除猜测。)

如果我创建这样

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;,这样它们都指向相同的东西。

+0

正在写我的答案,确切的解释和例子。 +1。 – AVK

+0

谢谢。我会深入挖掘。你写的代码看起来和我的代码完全相同,但是其中的一部分(设置ViewModel,实现INotifyPropertyChanged)被封装在Template10框架中,所以恶魔可能在细节中。 – NSouth

0

你为什么要在Sites属性的获得者中创建一个新的List<string>

尝试创建的源集合只一次

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