WPF Caliburn.Micro, связывающий свойство ViewModel внутри ItemTemplate - PullRequest
0 голосов
/ 05 апреля 2020

Как я могу связать видимость TooTip со свойством ToolTipVisibility, которое находится во ViewModel? У меня есть класс MenuObject,

public class MenuObject
{
    public string Name { get; set; }
    public string IconPath { get; set; }
}

Коллекция MenuObjects, свойство ToolTipVisibility в ViewModel,

public class MainViewModel : Conductor<object>
{
    private bool _toolTipVisibility;
    private ObservableCollection<MenuObject> _menuItems;
    public bool ToolTipVisibility
    {
        get { return _toolTipVisibility; }
        set
        {
            _toolTipVisibility = value;
            NotifyOfPropertyChange(() => ToolTipVisibility);
        }
    }
    public ObservableCollection<MenuObject> MenuItems
    {
        get { return _menuItems; }
        set
        {
            _menuItems = value;
            NotifyOfPropertyChange(() => MenuItems);
        }
    }
    public MainViewModel()
    {
        ToolTipVisibility = true;
    }
    public void ToggleVisibility()
    {
        ToolTipVisibility = !ToolTipVisibility;
    }
}

и привязка ListView с этой коллекцией

<ListView  x:Name="MenuItems">
   <ListView.ItemTemplate>
      <DataTemplate>
         <DataTemplate.Resources>
            <BooleanToVisibilityConverter x:Key="b2vc"/>
         </DataTemplate.Resources>
         <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Path=IconPath}" Stretch="None" Margin="12,0,0,0"/>
            <TextBlock Text="{Binding Path=Name}" Margin="25,0,0,0"/>
            <StackPanel.ToolTip>
               <ToolTip Content="{Binding Path=Name}"
                        Visibility="{Binding ..., Converter={StaticResource b2vc}}"/> <!--// How can i do this? //-->
            </StackPanel.ToolTip>
         </StackPanel>
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

Помогите мне, пожалуйста , Спасибо! :)

ОБНОВЛЕНИЕ: я пробовал много способов и все еще не могу восстановить его. Но я кое-что узнал. Если я добавлю

Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
    AncestorType={x:Type Window}, AncestorLevel=1},
    Path=DataContext.ToolTipVisibility, Converter={StaticResource b2vc}}"    

в тег StackPanel, то он будет работать нормально. Но если я добавлю то же самое в тег ToolTip, это не сработает. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Наконец-то я нашел решение. Вот ответ { ссылка }
Это для моего случая:

 <ToolTip Content="{Binding Path=Name}"
          Visibility="{Binding DataContext.ToolTipVisibility,
          Source={x:Reference MenuItems}, Converter={StaticResource b2vc}}/>
0 голосов
/ 05 апреля 2020

Хороший вопрос. Под видимым я собираюсь предположить, что вы имеете в виду «видимый при наведении мыши», поскольку именно это Visibility делает для свойства ToolTip в WPF.

Я использовал следующую модель представления, которая очень похожа на вашу. Я упустил все другие привязки, кроме видимости, для простоты:

private bool _isToolTipVisible;

// The 'ToolTip.Visibility' will be bound to this property
public bool IsToolTipVisible
{
    get => _isToolTipVisible;
    set
    {
        _isToolTipVisible = value;
        NotifyOfPropertyChange(nameof(IsToolTipVisible));
    }
}

// This is just so that I am able to demonstrate the effect
public void ChangeToolTipVisibility()
{
    IsToolTipVisible = !IsToolTipVisible;
}

Для представления, я сделал в значительной степени то, что вы уже делаете, просто добавив привязку к IsToolTipVisible, чтобы контролировать видимость подсказка Кнопка, которую я добавил, просто для того, чтобы продемонстрировать эффект (при вызове метода ChangeToolTipVisibility():

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="b2vc"/>
</Window.Resources>

<Grid Margin="100">
    <StackPanel Orientation="Horizontal">
        <StackPanel.ToolTip>
            <ToolTip Content="Lorem ipsum" Visibility="{Binding IsToolTipVisible, Converter={StaticResource b2vc}}"/>
        </StackPanel.ToolTip>

        <TextBlock Text="Button text" Margin="25,0,0,0"/>                
        <Button x:Name="ChangeToolTipVisibility" Content="Change visiblity" />

    </StackPanel>
</Grid>

Это все, что нужно. Так что вы уже были там, предполагая, что я поняла ваше вопрос правильно: -)

...