簡體   English   中英

如何將用戶控件屬性綁定到 observable 集合中包含的 observable 對象的屬性

[英]How do you bind user control properties to properties of an observable object contained in observable collection

我正在使用 MVVMLight 並且需要能夠在視圖初始化期間對大約 12 個切換框的屬性進行編程編輯。 由於它們太多,我想遍歷鏈接的屬性,我嘗試使用ObservableCollectionObservableObject其中包含要綁定到切換按鈕屬性的值。 我不確定這是綁定問題還是從ObservableObject繼承的INotifyPropertyChanged接口的錯誤實現。

這是包含我希望綁定到的屬性的類:

public class CavitySelect : ObservableObject
{
    private string _Text;
    public string Text
    {
        get { return _Text; }
        set
        {
            _Text = value;
            RaisePropertyChanged("Text");
        }
    }
    private bool _Visible;
    public bool Visible
    {
        get { return _Visible; }
        set
        {
            _Visible = value;
            RaisePropertyChanged("Visible");
        }
    }
    private bool _Toggle;

    public bool Toggle
    {
        get { return _Toggle; }
        set
        {
            _Toggle = value;
            RaisePropertyChanged("Toggle");
        }
    }

    public CavitySelect()
    {
        Text = "";
        Visible = false;
        Toggle = false;
    }
}

這是我的ObservableCollection的實例化:

private ObservableCollection<CavitySelect> _CavTogglesProperties;
public ObservableCollection<CavitySelect> CavTogglesProperties
{
    get { return _CavTogglesProperties; }
    set
    {
        _CavTogglesProperties = value;
        RaisePropertyChanged("CavTogglesProperties");
    }
}

public MyViewModel()
{
    this.CavTogglesProperties = GetCavities();
}    

public ObservableCollection<CavitySelect> GetCavities()
{
    CavitySelect t11 = new CavitySelect();
    CavitySelect t12 = new CavitySelect();
    CavitySelect t13 = new CavitySelect();
    CavitySelect t14 = new CavitySelect();
    CavitySelect t15 = new CavitySelect();
    CavitySelect t16 = new CavitySelect();
    CavitySelect t26 = new CavitySelect();
    CavitySelect t21 = new CavitySelect();
    CavitySelect t22 = new CavitySelect();
    CavitySelect t23 = new CavitySelect();
    CavitySelect t24 = new CavitySelect();
    CavitySelect t25 = new CavitySelect();
    ObservableCollection<CavitySelect> temp = new ObservableCollection<CavitySelect>() {t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
    return temp;
}

這是我嘗試綁定它的方式:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisibilty"/>
</Window.Resources>
<Grid Background="#FFF4F4F5" Margin="8,165,8,8"  DataContext="{Binding CavTogglesProperties}">
    <ToggleButton DataContext="{Binding t11}" Content="{Binding Text}" IsChecked="{Binding Toggle}" Visibility="{Binding Visible,Converter={StaticResource BoolToVisibilty}}"/> 
</Grid>

我已經確認 View 到 ViewModel 類的綁定工作正常。 我也嘗試過綁定而不先設置包含網格的DataContext ,例如:

<ToggleButton DataContext="{Binding CavTogglesProperties[t11]}" ... />

澄清一下:每個 CavitySelect 項都與 GridView 中的一個切換按鈕相關,並且屬性將根據未顯示的輸入進行初始化。

顯示項目集合

你的問題並沒有說得很清楚,但我相信你想在你的 UI 中顯示一個項目列表; 但是,正如當前實現的那樣,您的 XAML 確實結構化為顯示單個項目。

要顯示列表,您需要查看各種集合視圖中的任何一種(例如ListViewGridView等)。

例如:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisibilty"/>
</Window.Resources>
<Grid Background="#FFF4F4F5" Margin="8,165,8,8">
  <ListView ItemsSource="{Binding CavTogglesProperties}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ToggleButton Content="{Binding Text}" IsChecked="{Binding Toggle}" />
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</Grid>

要僅顯示特定項目,您應該在 ViewModel 中過濾列表,而不是綁定可見性。 如果可見的項目在顯示時沒有改變,只需在填充列表時過濾列表。

但是,如果可見性會發生變化並且您希望視圖反映這些變化,請查看為您的項目源實現過濾器,如以下問題中所述: 如何在 WPF 中過濾 ListView? .

由於您已經在使用 ObservableCollection 和 ObservableObject,所以一切都應該自動更新。

顯示集合中的單個項目

如果我讀錯了您的問題並且您想知道如何顯示集合中的單個項目,則有幾種不同的方法可以解決這個問題:

  1. 將單個項目作為 ViewModel 上的一個屬性公開,這樣 View 就不必深入到列表中。
  2. 創建一個接收集合和索引的轉換器,然后提取正確的項目。

不過,我強烈建議使用選項 1,因為它最符合 MVVM,生成最干凈和最可測試的代碼。

例如:

private ObservableCollection<CavitySelect> _CavTogglesProperties;
public ObservableCollection<CavitySelect> CavTogglesProperties
{
    get { return _CavTogglesProperties; }
    set
    {
        _CavTogglesProperties = value;
        RaisePropertyChanged("CavTogglesProperties");
    }
}

private CavitySelect _SpecificCavToggle;
public CavitySelect SpecificCavToggle
{
    get { return _SpecificCavToggle; }
    set
    {
        _SpecificCavToggle= value;
        RaisePropertyChanged("SpecificCavToggle");
    }
}

public MyViewModel()
{
    this.CavTogglesProperties = GetCavities();
    this.SpecificCavToggle = this.CavTogglesProperties[0];
}    

public ObservableCollection<CavitySelect> GetCavities()
{
    CavitySelect t11 = new CavitySelect();
    CavitySelect t12 = new CavitySelect();
    CavitySelect t13 = new CavitySelect();
    CavitySelect t14 = new CavitySelect();
    CavitySelect t15 = new CavitySelect();
    CavitySelect t16 = new CavitySelect();
    CavitySelect t26 = new CavitySelect();
    CavitySelect t21 = new CavitySelect();
    CavitySelect t22 = new CavitySelect();
    CavitySelect t23 = new CavitySelect();
    CavitySelect t24 = new CavitySelect();
    CavitySelect t25 = new CavitySelect();
    ObservableCollection<CavitySelect> temp = new ObservableCollection<CavitySelect>() {t11,t12,t13,t14,t15,t16,t21,t22,t23,t24,t25,t26};
    return temp;
}

暫無
暫無

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

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