gpt4 book ai didi

c# - WPF - 具有 MultiBinding 和不同 DataContexts 的自定义工具提示

转载 作者:行者123 更新时间:2023-12-03 10:31:38 25 4
gpt4 key购买 nike

我想做一个UserControl在 WPF (C# - MVVM) 中,自定义两行 ToolTip .

在 View 中我有一个 ListBoxItemSource和自定义 ItemTemplate在哪里设置以前的ToolTip在运行时只显示第一行,而第二行是空的 string .确实问题出在 ToolTip 的第二行。我在哪里使用 MultiBinding带转换器; try/catch 中出现故障的转换器返回一个空 string .

我知道异常是由 null 的值生成的。虽然它应该是 int不可为空,但我不明白为什么。
编辑:我说错了null ;问题是转换器由于 DependencyProperty UnsetValue 而发生强制转换异常,我不知道为什么。

这里转换器代码:

public class FromDecimal_MVConverter : Base_MVConverter
{
public override object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
try
{
// Default are 2 decimals
if (values.Length == 2)
{
int decimals;
switch ((int)values[1])
{
case int dec when dec < 0:
decimals = 0;
break;
case int dec when dec > 99:
decimals = 99;
break;
default:
decimals = (int)values[1];
break;
}
return ((decimal)values[0]).ToString("N" + decimals.ToString());
}
else
{
return ((decimal)values[0]).ToString("N2");
}
}
catch
{
return string.Empty;
}
}

public override object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

这里 XAML 代码:
...
<ListBox ItemsSource="{Binding Values, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<ToolTipService.ToolTip>
<StackPanel>
<TextBlock Text="{Binding Description}"/>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{cv_ToString:FromDecimal_MVConverter}">
<Binding Path="Value"/>
<Binding Path="Decimals" RelativeSource="{RelativeSource FindAncestor, AncestorType=UserControl}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ToolTipService.ToolTip>
<TextBlock Foreground="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
<TextBlock.Text>
<MultiBinding Converter="{cv_ToString:FromDecimal_MVConverter}">
<Binding Path="Value"/>
<Binding Path="Decimals" RelativeSource="{RelativeSource FindAncestor, AncestorType=UserControl}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
...

如您所见 ValueObservableCollection Values 中对象的属性. DecimalsValues是与它们的依赖属性相关联的代码中的属性。

这里 Decimals定义:
public static readonly DependencyProperty DecimalsProperty = DependencyProperty.RegisterAttached("Decimals", typeof(int), typeof(ucMyUserControl), new FrameworkPropertyMetadata(2) { BindsTwoWayByDefault = true });

public int Decimals
{
get { return (int)GetValue(DecimalsProperty); }
set { SetValue(DecimalsProperty, value); }
}

我不明白为什么 TextBlockToolTip它有效,为什么在 ToolTip不是。
我该如何解决这个问题?

最佳答案

绑定(bind)失败,因为 UserControl不是 ToolTip 的视觉祖先.

你可以绑定(bind) Tag Grid 的属性(property)到Decimals属性,然后绑定(bind)到 Tag属性使用 PlacementTarget ToolTip 的属性(property):

<DataTemplate>
<Grid Tag="{Binding Decimals, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}">
<Grid.ToolTip>
<ToolTip>
<StackPanel>
<TextBlock Text="{Binding Description}"/>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{cv_ToString:FromDecimal_MVConverter}">
<Binding Path="Value"/>
<Binding Path="PlacementTarget.Tag" RelativeSource="{RelativeSource FindAncestor, AncestorType=ToolTip}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ToolTip>
</Grid.ToolTip>
...
</Grid>
</DataTemplate>

关于c# - WPF - 具有 MultiBinding 和不同 DataContexts 的自定义工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59896105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com