Привязать видимость к другому источнику, чем DataContext - PullRequest
1 голос
/ 23 августа 2010

У меня есть две модели просмотра:

public class CommandViewModel
{
    public string DisplayName { get; set; }
    public ICommand Command { get; set; }
}

и

public class SomeViewModel : INotifyPropertyChanged
{
    private bool someFlag;
    private CommandViewModel someCommand;

    public bool SomeFlag
    {
        get
        {
            return someFlag;
        }
        set
        {
            if (value == someFlag)
                return;
            someFlag = value;
            OnPropertyChanged("SomeFlag");
        }
    }

    public CommandViewModel SomeCommandViewModel
    {
        get
        {
            if (someCommand == null)
            {
                someCommand = new CommandViewModel();
                // TODO: actually set the DisplayName and Command
            }
            return someCommand;
        }
    }
}

И у меня есть два соответствующих просмотра:

<UserControl x:Class="ButtonView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="28" d:DesignWidth="91">
    <Button Content="{Binding Path=DisplayName}" Command="{Binding Path=Command}" />
</UserControl>

и

<UserControl x:Class="SomeView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d" Height="125" Width="293" />

    <ViewButton
        Visibility="{Binding Path=SomeFlag, Converter={StaticResource BoolToVisibilityConverter}}"
        DataContext="{Binding Path=SomeCommandViewModel}" />
</UserControl>

У меня проблема с получением видимости ButtonView, когда его DataContext также привязан.Если я опускаю DataContext, Visibility работает просто отлично (когда SomeFlag переключает значение, видимость кнопки изменяется вместе с ним), но текст и команда отображения не работают.Если я связываю DataContext, отображаемый текст и команда работают, но видимость - нет.Я уверен, что это связано с тем, что когда я связываю DataContext с SomeCommandViewModel, он ожидает, что в нем будет существовать SomeFlag.И, конечно, это не так.

Ответы [ 2 ]

6 голосов
/ 24 августа 2010

Если вы установите DataContext любого данного элемента, то КАЖДАЯ привязка (включая дочерние) этого элемента будет использовать DataContext в качестве источника, если вы явно не предоставите другой источник.

Похоже, что вы указываете сразу 2 DataContext (UserControl.DataContext НЕ читается, поскольку ViewButton.DataContext установлен, и первый найденный источник считает).

Вы можете явно взять текст данных данного элемента, как утверждает Кент ИЛИ ЖЕ Вы можете указать источник явно. например,

<ViewButton
    Visibility="{Binding Path=SomeFlag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Converter={StaticResource BoolToVisibilityConverter}}"
    DataContext="{Binding Path=SomeCommandViewModel}" />
4 голосов
/ 23 августа 2010

Я не одобряю ваш дизайн, но это обойдет вашу непосредственную проблему:

<UserControl x:Name="root"
    x:Class="SomeView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d" Height="125" Width="293" />

    <ViewButton
        Visibility="{Binding Path=DataContext.SomeFlag, Converter={StaticResource BoolToVisibilityConverter}, ElementName=root}"
        DataContext="{Binding Path=SomeCommandViewModel}" />
</UserControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...