如何在 DataTemplate 中绑定两个不同的类属性

Posted

技术标签:

【中文标题】如何在 DataTemplate 中绑定两个不同的类属性【英文标题】:How to bind two different class properties in DataTemplate 【发布时间】:2021-02-06 13:42:37 【问题描述】:

我正在尝试在 DataTemplate 中绑定来自不同类的两个属性。

<DataTemplate x:Key="DemoItemTemplate" x:DataType="local:DemoInfo">
   <NavigationViewItem Visibility="Binding Visibility, Mode=TwoWay" Content="x:Bind Name"/>
</DataTemplate>

DataType 设置为 DemoInfo 用于此 DataTemplateName 值更新自 DemoInfo

我已经尝试将视图模型作为源和相对源绑定。但是Visibility 属性绑定在ViewModel 类中不起作用。任何建议如何实现这一目标?

Visibility="Binding Visibility, Source=StaticResource viewModel"

【问题讨论】:

【参考方案1】:

AFAIK,你不能在 UWP 中使用多重绑定,你可以尝试使用定位器What is a ViewModelLocator and what are its pros/cons compared to DataTemplates?

【讨论】:

【参考方案2】:

如何在DataTemplate中绑定两个不同的类属性

如果您将可见性与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));
    

更多详情请参考Data binding in depth官方文档。

【讨论】:

谢谢,但是当应用程序加载时它工作正常,而当 Visibility 值在运行时动态变化时它不能工作。我已将模式设置为 TwoWay 并将 UpdateSourceTrigger 设置为 xaml 中的 PropertyChanged 和用于 ViewModel 类中的 Visibility 属性的 RaisePropertyChanged()。 ViewModel类需要实现INotifyPropertyChanged接口 @KanniyappanP,我已经更新了案例回复,请查收。

以上是关于如何在 DataTemplate 中绑定两个不同的类属性的主要内容,如果未能解决你的问题,请参考以下文章

XAML:相同的模板,不同的绑定

DataTemplate WPF 中样式设置器中的绑定

WPF 在 GridViewColumn.CellTemplate 的 DataTemplate 中绑定 UserControl 属性

如何使 WPF DataGrid 显示具有绑定和 DataTemplate 的 ViewModel 集合

C#/WPF:获取 DataTemplate 中元素的绑定路径

ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级