MVVM - 如何将HierarchicalDataTemplate项的可见性绑定到ViewModel字段

时间:2017-06-09 12:12:18

标签: c# wpf mvvm

我有一个HierarchicalDataTemplate,它包含许多项目,并且每个项目旁边都有一个小图像。这是我想要绑定的这些图像的可见性。项目的图像是否可见取决于该项目是否出现在服务器上的DataTable中。

为了确定项目的可见性,我需要该项目的ID号和访问服务器的接口。该接口保留为ViewModel中的字段。

理想情况下,如果我可以根据项目的ID进行绑定,我只能在我的ViewModel中使用此方法:

public Visibility ItemIsInTable(int ID)
{
    string sql = "SELECT ID FROM MyTable WHERE ID = " + ID;
    DataTable dataTable = serverInterface.FetchDataFromDatabase(sql);

    if (dataTable.Rows.Count > 0)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}

我的绑定如何依赖于项目ID和我的ViewModel接口?

1 个答案:

答案 0 :(得分:1)

您的ViewModel属性应该是布尔值,您将使用转换器。

public bool ItemIsInTable {get { ... } set { ...; OnPropertyChanged("ItemIsInTable"); }}

[编辑]

确定。 您必须拥有ObservableColletction个项目(在我的示例中为ItemsSource

class ItemSource: INotifyPropertyChanged 
{
    public int Id {get { ... } set { ...; OnPropertyChanged("Id"); }}
    public bool ItemIsInTable {get { ... } set { ...; OnPropertyChanged("ItemIsInTable"); }}
    ....
}

在ViewModel中:

ObservableColletction<ItemSource> ItemsSource  {get { ... } set { ...; OnPropertyChanged("ItemsSource"); }}

现在你应该验证Id

foreach(var item in ItemsSource)
    item.ItemIsInTable = MethodToVerifyIdInDataBase(item.Id);

[/编辑]

XAML是这样的:

<HierarchicalDataTemplate ItemsSource="{Binding ItemSource}"   >
    <Grid Visibility="{Binding ItemIsInTable, Converter={StaticResource BoolToVisibilityConverter}}" >
        ....
    </Grid>
</HierarchicalDataTemplate>

的App.xaml:

<converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>

转换器类:

public class BoolToVisibilityConverter: IValueConverter 
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var rv = Visibility.Visible;
        try
        {
            if (value != null)
                rv = (bool)value ? Visibility.Visible : Visibility.Collapsed;
        }
        catch
        {
            // ignored
        }
        return rv;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value != null) && (value == (object)Visibility.Visible);
    }
}