簡體   English   中英

ComboBox SelectedItem未設置為x:Bind

[英]ComboBox SelectedItem not set with x:Bind

我試圖找出為什么我不能在我的ComboBox上設置初始SelectedItem值,如果我與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,以消除回答未來問題時的猜​​測。)

如果我像這樣創建一個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在兩個綁定路徑中x:Bind並引用ViewModel。

我懷疑你的困惑在於x:BindBinding之間的區別。
使用x:Bind綁定路徑的根是綁定控件的頁面。
使用Binding綁定路徑的根是控件所在頁面的DataContext
混合兩者可能會讓人感到困惑。 如果你確實需要使用兩者的組合,那么設置this.DataContext = this; 在頁面構造函數中,所以它們都指向同一個東西。

為什么要在Sites屬性的getter中創建一個新的List<string>

嘗試僅創建一次源集合:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM