WPF Caliburn.Micro 在 ItemTemplate 中绑定 ViewModel 属性
WPF Caliburn.Micro binding ViewModel property inside ItemTemplate
如何将 TooTip 的可见性绑定到 ViewModel 中的 ToolTipVisibility 属性?
我有 MenuObject class,
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
中,它就不起作用了。我错过了什么?
好问题。通过可见,我假设您的意思是 "visible when mouse over",因为这就是 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>
仅此而已。假设我正确理解了你的问题,那么你已经差不多了:-)
终于找到了解决办法。这是答案
这是我的情况:
<ToolTip Content="{Binding Path=Name}"
Visibility="{Binding DataContext.ToolTipVisibility,
Source={x:Reference MenuItems}, Converter={StaticResource b2vc}}/>
如何将 TooTip 的可见性绑定到 ViewModel 中的 ToolTipVisibility 属性? 我有 MenuObject class,
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
中,它就不起作用了。我错过了什么?
好问题。通过可见,我假设您的意思是 "visible when mouse over",因为这就是 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>
仅此而已。假设我正确理解了你的问题,那么你已经差不多了:-)
终于找到了解决办法。这是答案
这是我的情况:
<ToolTip Content="{Binding Path=Name}"
Visibility="{Binding DataContext.ToolTipVisibility,
Source={x:Reference MenuItems}, Converter={StaticResource b2vc}}/>