Как связать два разных свойства класса в DataTemplate

Я пытаюсь связать два свойства из разных классов в 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}}"

3 ответа

Как связать два разных свойства класса в DataTemplate

Если связать видимость с StaticResource, пожалуйста, объявите класс ViewModel на своей странице 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 изменялось динамически во время выполнения, вам необходимо реализовать интерфейс INotifyPropertyChanged для класса ViewModel.

       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));
    }
}

Подробнее см. В официальном документе " Подробная привязка данных".

AFAIK, вы не можете использовать multibinding в UWP, вы можете попробовать использовать Locator. Что такое ViewModelLocator и каковы его плюсы и минусы по сравнению с DataTemplates?

Я могу ошибаться, но я думал, что у свойства есть выделенное перечисление, содержащее все возможные параметры (Visibility Enum) для свойства. Итак, ваша привязка может работать нормально, ноTypeсвязанного свойства должно иметь типVisibilityс использованиемSystem.Windows.

Кстати, я бы в любом случае не стал добавлять свойство видимости в модель представления. Я думаю, что более стандартным подходом было бы обеспечить видимостьDependencyPropertyв непосредственном коде представления для вашей привязки.

Другие вопросы по тегам