【问题标题】:WPF Caliburn.Micro binding ViewModel property inside ItemTemplateWPF Caliburn.Micro 在 ItemTemplate 中绑定 ViewModel 属性
【发布时间】:2020-04-05 19:00:23
【问题描述】:

如何将 TooTip 的 Visibility 绑定到 ViewModel 中的 ToolTipVisibility 属性? 我有 MenuObject 类,

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

MenuObjects 集合,ViewModel 中的 ToolTipVisibility 属性,

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 中,它就不起作用了。我错过了什么?

【问题讨论】:

    标签: c# wpf xaml caliburn.micro


    【解决方案1】:

    好问题。通过可见,我将假设您的意思是“鼠标悬停时可见”,因为这是 Visibility 对 WPF 中的 ToolTip 属性所做的。

    我使用了以下视图模型,它与您的非常相似。为简单起见,我省略了除可见性之外的所有其他绑定:

    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>
    

    仅此而已。所以你几乎已经在那里了,假设我正确理解了你的问题:-)

    【讨论】:

    • 感谢您的回答,但这不是我的意思。我的问题是如何在 ItemTemplate 中绑定属性,这不是对象的属性。我的意思是我知道如何绑定“Name”和“IconPath”,它们是“MenuObject”的属性,但我不知道如何在 ItemTemplate 中绑定“ToolTipVisibility”。希望你能理解,对不起xd
    • 弗里克,我错过了那部分。对不起。
    • @loykods Visibility="{TemplateBinding _someProperty_, ElementName=_otherControlName_}"
    • @aepot 我有一个错误:“在“TemplateBindingExtension”类型中找不到属性“ElementName”。它适用于“Binding”而不是“TemplateBinding”,但是 otherControlName 我需要写,如果我的“someProperty”不是任何控件的属性。“someProperty”只是我的 ViewModel 中的公共属性
    • @loykods 是的,抱歉误导。我的错。然后尝试{Binding _someProperty_, RelativeSource={RelativeSource AncestorType=_parentControlType_}},以防您需要一些父控件的属性。
    【解决方案2】:

    最后,我找到了解决方案。这是https://stackoverflow.com/a/26223802/13230344的asnwer@
    这是我的情况:

     <ToolTip Content="{Binding Path=Name}"
              Visibility="{Binding DataContext.ToolTipVisibility,
              Source={x:Reference MenuItems}, Converter={StaticResource b2vc}}/>
    

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2015-11-24
      • 2016-01-11
      相关资源
      最近更新 更多