当我从代码设置工具提示时,WPF工具提示绑定被覆盖

tcbh2hod  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(143)

我有一个用户控件,并将该控件的工具提示绑定到某个对象的属性中

<usercontrols:ucButton x:Name="xSaveCurrentBtn" ButtonType="ImageButton" ButtonFontImageSize="16" ButtonImageWidth="18" ButtonImageHeight="18" ButtonImageType="Save" Click="xSaveSelectedButton_Click" ButtonStyle="{StaticResource $ImageButtonStyle_Menu}" DockPanel.Dock="Right" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,0,0">
                            <usercontrols:ucButton.ToolTip>
                                <ToolTip Content="{Binding ItemName, Mode=OneWay}" ContentStringFormat="Save {0}"/>
                            </usercontrols:ucButton.ToolTip>
                        </usercontrols:ucButton>

在代码中,我将ucButton的数据上下文设置为我的对象:

xSaveCurrentBtn.DataContext = WorkSpace.Instance.CurrentSelectedItem;

有时CurrentSelectedItem为null,如果是这种情况,我希望工具提示显示“未选择任何项”我尝试这样做:

xSaveCurrentBtn.Tooltip = "No Item Selected";

但是当CurrentSelectedItem不为null并且我将xSaveBtn.DataContext重置为该对象时,我仍然会看到“未选择任何项目”工具提示,就好像我的WPF工具提示部分被覆盖了并且它不再绑定到datacontext ItemName属性中一样

ajsxfq5m

ajsxfq5m1#

您尝试同时将属性设定为两个值。这是不可能的。您在XAML中所做的相当于:

xSaveCurrentBtn.Tooltip = new ToolTip() {.....};

当您将字串值设定为相同的属性时,先前的值会遗失。而且如果您不先保存它,就无法还原。
如果发生绑定错误,您可能需要分配一个值:

<ToolTip Content="{Binding ItemName,
                           Mode=OneWay,
                           FallbackValue='No Item Selected'}"
         ContentStringFormat="Save {0}"/>

如何绑定要更新的数据上下文以使其成为新的CurrentSelectedItem而不显式设置它?
假设WorkSpace.Instance是一个返回WorkSpace示例的不可变属性,而CurrentSelectedItem是一个带有INotifyPropertyChanged.PropertyChanged通知的属性,那么你可以这样做:

<usercontrols:ucButton DataContext="{Binding CurrentSelectedItem, Source={x:Static viewmodels:WorkSpace.Instance}}" ...>

前缀“viewmodels”取决于声明“WorkSpace”类的程序集和命名空间。

mlmc2os5

mlmc2os52#

您可以将ContentTemplate与TextBlock一起使用,它将使用StringFormat或TargetNullValue,具体取决于ItemName是否为null

<usercontrols:ucButton.ToolTip>
    <ToolTip Content="{Binding ItemName}">
        <ToolTip.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding StringFormat='Save {0}',
                                          TargetNullValue='No Item Selected'}"/>
            </DataTemplate> 
        </ToolTip.ContentTemplate>
    </ToolTip>
</usercontrols:ucButton.ToolTip>

或者如果您绑定Tooltip.Content,则会有不同的结果:

<usercontrols:ucButton.ToolTip>
    <ToolTip Content="{Binding}">
        <ToolTip.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=ItemName,
                                          StringFormat='Save {0}',
                                          FallbackValue='No Item Selected'}"/>
            </DataTemplate> 
        </ToolTip.ContentTemplate>
    </ToolTip>
</usercontrols:ucButton.ToolTip>

相关问题