我正在尝试绑定 DataTemplate 中不同类的两个属性。
<DataTemplate x:Key="DemoItemTemplate" x:DataType="local:DemoInfo">
<NavigationViewItem Visibility="{Binding Visibility, Mode=TwoWay}" Content="{x:Bind Name}"/>
</DataTemplate>
将此 DataType
的
DemoInfo
设置为 DataTemplate
,并从 Name
更新 DemoInfo
值。
我尝试过将视图模型视为源和相对源绑定。但是
Visibility
属性绑定在 ViewModel
类中不起作用。有什么建议如何实现这一目标吗?
Visibility="{Binding Visibility, Source={StaticResource viewModel}}"
AFAIK,你不能在 UWP 中使用多重绑定,你可以尝试使用 Locator 什么是 ViewModelLocator,与 DataTemplates 相比,它的优点/缺点是什么?
如何在DataTemplate中绑定两个不同的类属性
如果您将 Visibility 与
StaticResource
绑定,请在页面 Resources
中声明 ViewModel 类,如下所示。
视图模型
public class ViewModel
{
public ViewModel()
{
Visibility = false;
}
public bool Visibility { get; set; }
}
Xaml
<Page.Resources>
<local:ViewModel x:Key="ViewModel" />
</Page.Resources>
<DataTemplate x:DataType="local:Item">
<TextBlock
Width="100"
Height="44"
Text="{x:Bind Name}"
Visibility="{Binding Visibility, Source={StaticResource ViewModel}}" />
</StackPanel>
</DataTemplate>
更新
如果您希望 Visibility 值在运行时动态更改,您需要为 ViewModel 类实现 INotifyPropertyChanged 接口。
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
Visibility = false;
}
private bool _visibility;
public bool Visibility
{
get
{
return _visibility;
}
set
{
_visibility = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string PropertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
}
更多详情请参考深度数据绑定官方文档
我可能是错的,但我认为
Visibility
属性有一个专用枚举,其中包含 Visibility
属性的所有可能选项(Visibility Enum)。因此,您的绑定可能工作得很好,但绑定属性的
Type
需要使用 Visibility
为 System.Windows
类型。
顺便说一句,我无论如何都不会在视图模型中添加可见性属性。我认为更标准的方法是在绑定视图后面的直接代码中具有可见性
DependencyProperty
。