【问题标题】:How to bind two different class properties in DataTemplate如何在 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}}"

【问题讨论】:

    标签: data-binding uwp binding datatemplate winui-3


    【解决方案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,我已经更新了案例回复,请查收。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多