我有一个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接口?
答案 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);
}
}