簡體   English   中英

MVVM Datagrid與通用類型的Observable Collection綁定

[英]MVVM Datagrid to Observable Collection binding of generic types

我有一個xaml UserControl,其中DataContext引用了“ Control” -ViewModel。

mc:Ignorable="d" d:DataContext="{d:DesignInstance controls:ControlViewModel}"

此外,我已將ItemsSource綁定到ObservableCollection,后者是“ Data” -ViewModel的通用類。 (請注意:這些數據僅用於演示)

    <DataGrid ItemsSource="{Binding DataCollection}" SelectedItem="{Binding SelectedData}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Age" Visibility="{Binding AgeVisibility}"  Binding="{Binding Age}"/>
        </DataGrid.Columns>
    </DataGrid>

public class ControlViewModel
{
        private ObservableCollection<DataViewModel> _dataViewModels;
        public ObservableCollection<DataViewModel> DataViewModels
        {
            get { return _dataViewModels; }
            set
            {
                   _dataViewModels = value;
                    RaisePropertyChanged("DataViewModels");
            }
        }
}

“數據” -ViewModel具有以下屬性,我已將它們綁定到特定的DataGridTextColumn(如您所見)。

public class DataViewModel
{
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                RaisePropertyChanged("Name");
            }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set
            {
                _age = value;
                RaisePropertyChanged("Age");
            }
        }

        private Visibility _ageVisibility;
        public Visibility AgeVisibility
        {
            get { return _ageVisibility; }
        }
}

一切正常,希望“年齡”(Age)列的Visibilty屬性不會輕易引用Observable集合的通用DataViewModel(屬性),例如Binding屬性。 因此無法解決,並且始終處於默認狀態。

如果您想要一個可綁定的屬性,則將第二個RaisePropertyChanged添加到控制readonly屬性的屬性中。

public class DataViewModel
{
    //other stuff

    private int _age;
    public int Age
    {
        get { return _age; }
        set
        {
            _age = value;
            RaisePropertyChanged("Age");
            RaisePropertyChanged("AgeVisibility");
        }
    }

    public Visibility AgeVisibility
    {
        get { return this.Age > 0 ? Visibility.Visible : Visibility.Hidden; }
    }
}

您也可以像這樣使用類型轉換器

暫無
暫無

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

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