标签: ivalueconverter

在IValueConverter上进行数据绑定

有人知道是否可以在基于IValueConverter的类上进行数据绑定?

我有以下转换器:

[ValueConversion(typeof(int), typeof(Article))]
public class LookupArticleConverter : FrameworkElement, IValueConverter {
    public static readonly DependencyProperty ArticlesProperty = DependencyProperty.Register("Articles", typeof(IEnumerable<Article>), typeof(LookupArticleConverter)); 

    public IEnumerable<Article> Articles
    {
        get { return (IEnumerable<Article>)GetValue(ArticlesProperty); }
        set { SetValue(ArticlesProperty, value); }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        ...
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它的目的是通过Id查找列表中的文章,并返回该文章.

但是,我想通过将一个集合数据绑定到它来填充Articles属性,如下所示:

<local:LookupArticleConverter Articles="{Binding Articles}" x:Key="LookupArticle"/>
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.永远不会调用setter方法.source属性包含一个实际的非空集合,所以这不是问题.

两者都没有关于输出日志中的绑定的错误消息.

有线索吗?

data-binding wpf dependencyobject ivalueconverter

7
推荐指数
2
解决办法
5206
查看次数

为什么在绑定上放置no-op转换器会改变它的行为?

我正在测试我构建的用户控件,我遇到的东西对我来说是莫名其妙的.

该控件是ComboBox的扩展,用于处理特定自定义类型的值.它具有该自定义类型的依赖项属性,该属性是Binding的目标属性.

我在setter中有一个trace语句,我可以看到该属性已经设置好了.但它没有出现在我的用户控件中.

现在,通常我会说,好吧,我的用户控件中有一个错误.我可能会这样做,虽然我对此感到困惑.但这个问题不是要找到我控制中的错误.继续阅读; 这里是奇怪的地方.

我也使用Bea Stollnitz的小值转换器来帮助调试绑定:

public class DebuggingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value; // Add the breakpoint here!!
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException("This method should never be called");
    }
}
Run Code Online (Sandbox Code Playgroud)

这背后的想法是我将这个转换器添加到我的Binding中,并且可以设置一个断点来查看推送到目标的值.好的,这很好用.我可以看到价值被推出.

事实上,它的工作有点精细了.如果DebuggingConverter附加到Binding,则用户控件将显示该值.如果不是,那就没有.

这怎么可能呢?如果一个值转换器不会影响绑定控件的行为?

编辑:

并不是说它可能有所帮助,但这是用户控件的XAML:

<a:CodeLookupBox
    Grid.Column="1"
    Grid.IsSharedSizeScope="True"
    MinWidth="100"
    Style="{Binding Style}">
    <a:CodeLookupBox.CodeLookupTable>
        <Binding Path="Codes" Mode="OneWay"/>
    </a:CodeLookupBox.CodeLookupTable>
    <a:CodeLookupBox.SelectedCode>
        <Binding Path="Value" Mode="TwoWay" ValidatesOnDataErrors="True"/>
    </a:CodeLookupBox.SelectedCode>
</a:CodeLookupBox>
Run Code Online (Sandbox Code Playgroud)

如果没有第二个绑定上的转换器,控件就像我没有设置一样SelectedCode …

wpf binding user-controls ivalueconverter

7
推荐指数
1
解决办法
499
查看次数

我可以使用enum作为ConverterParameter吗?

目前我正在使用整数作为ConverterParameter,并将其转换EnumConverter.我发现它非常难以理解XAML.

我想知道是否有办法Enum在资源部分声明并将其值传递给它ConverterParameter

.net wpf xaml ivalueconverter

7
推荐指数
1
解决办法
4509
查看次数

WPF:如何注册其他隐式值转换器?

我发现了一个问题,询问如何避免向自己的应用程序资源添加自定义值转换器:

在WPF中使用值转换器,而不必先将它们定义为资源

但是我想超越它并注册那些隐含的转换器,如下例所示:

<SolidColorBrush Color="Blue" />
Run Code Online (Sandbox Code Playgroud)

在这里,我假设一些隐含的"StringToSolidColorBrushConverter"正在踢,这使得示例工作.

这个例子并不能正常工作:

<Window.Resources>
    <Color x:Key="ForegroundFontColor">Blue</Color>
</Window.Resources>

<TextBlock Foreground={StaticResource ForegroundFontColor}>Hello</TextBlock>
Run Code Online (Sandbox Code Playgroud)

我相信这是因为没有任何证据ColorToSolidColorBrushConverter表明WPF可以拿起并使用它.我知道如何创建一个,但是如何"注册"它以便WPF自动使用它而不在绑定表达式中指定转换器?

.net wpf ivalueconverter

7
推荐指数
1
解决办法
1414
查看次数

ValueConversion属性的好处是什么?

我没有实现的问题ValueConverter

在MSDN上,我找到了以下ValueConversion属性:

[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        return date.ToShortDateString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string strValue = value as string;
        DateTime resultDateTime;
        if (DateTime.TryParse(strValue, out resultDateTime))
        {
            return resultDateTime;
        }
        return DependencyProperty.UnsetValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

这会让我感兴趣:

  • 什么时候可以使用?
  • 我什么时候应该使用它?

感谢您的提示!

c# wpf msdn binding ivalueconverter

7
推荐指数
0
解决办法
465
查看次数

如何在 IValueConverter 中使用 targetType 参数?

我有一个IValueConverter我想用它来做简单的数学运算,它具有以下Convert功能:

public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        if (parameter == null)
        {
            return value;
        }

        switch (((string)parameter).ToCharArray()[0])
        {
            case '%':
                return (double)value % double.Parse(
                    ((string)parameter).TrimStart(new char[] {'%'}));
            case '*':
                return (double)value * double.Parse(
                    ((string)parameter).TrimStart(new char[] {'*'}));
            case '/':
                return (double)value / double.Parse(
                    ((string)parameter).TrimStart(new char[] {'/'}));
            case '+':
                return (double)value + double.Parse(
                    ((string)parameter).TrimStart(new char[] {'+'}));
            case '-':
                if (((string)parameter).Length > 1)
                {
                    return (double)value - double.Parse(
                        ((string)parameter).TrimStart(new char[] {'-'}));
                }
                else …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml type-conversion ivalueconverter

7
推荐指数
1
解决办法
2667
查看次数

WPF和MVVM:在运行时更改数据绑定转换器

我在用户界面中使用WPF和MVVM模式.在我的ViewModel中,我有一个List,其中包含以毫米为单位的距离,我通过将ListView.ItemsSource绑定到List来显示在ListView中.但是,我希望显示的值使用更自然的单位 - 米或英尺,具体取决于"公制"复选框的状态.

我写了几个简单的类,MillimetresToMetresConverter和MillimetresToFeetConverter,它们都实现了IValueConverter.虽然我可以将我的数据绑定上的Converter属性设置为一个或另一个,但我不确定当复选框的状态发生变化时如何在这些转换器之间进行更改.

我的计划是在我的ViewModel上有一个字段"IValueConverter lengthConverter",我可以设置为一个转换器或另一个,然后在我的XAML中...="{Binding Converter={Binding Path=lengthConverter}}"- 遗憾的是这不起作用,因为Converter不是依赖属性.

如何在运行时更改数据绑定使用的转换器?

data-binding wpf mvvm ivalueconverter

6
推荐指数
2
解决办法
3642
查看次数

在WPF中Bool到Visibility Converter

我有三个单选按钮和三个组框,根据单选按钮的选择,组框应该已经可见或折叠,但似乎没有什么工作在这里.我的构造函数的代码被执行,但似乎事情彼此重叠.

<baseControls:MaintainTemplate Style="{StaticResource {x:Type baseControls:MaintainTemplate}}" TitleText="{Binding TitleText}">

    <baseControls:MaintainTemplate.TabSection>
        <Grid>
            <GroupBox>
                <GroupBox.Header>
                    <TextBlock Text="Case Information" Style="{StaticResource TextBlockWhite}"/>
                </GroupBox.Header>
                <GroupBox.Content>
                    <Grid x:Name="GridMain">
                        <Grid.RowDefinitions>
                            <RowDefinition Style="{StaticResource AutoHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource AutoHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource AutoHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource MaxHeightRowDefinition}"/>
                            <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Style="{StaticResource MinWidthColumnDefinition}"/>
                            <ColumnDefinition Style="{StaticResource MaxWidthColumnDefinition}"/>
                            <ColumnDefinition Style="{StaticResource MinWidthColumnDefinition}"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="1" x:Name="GridSelectCustomer">
                            <Grid.RowDefinitions>
                                <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                                <RowDefinition Style="{StaticResource AutoHeightRowDefinition}"/>
                                <RowDefinition Style="{StaticResource MinHeightRowDefinition}"/>
                                <RowDefinition Style="{StaticResource AutoHeightRowDefinition}"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Style="{StaticResource AutoWidthColumnDefinition}"/>
                                <ColumnDefinition Style="{StaticResource …
Run Code Online (Sandbox Code Playgroud)

c# wpf binding converters ivalueconverter

6
推荐指数
1
解决办法
3万
查看次数

将ValueConverter存储到变量

我有一个ValueConverter用于绑定StoryBoard动画中的'To'Value,类似于答案 - WPF动画:绑定到storyboard动画的"To"属性.

问题是我MultiBinding ValueConverter在几个地方重复下面的代码.

    <MultiBinding Converter="{StaticResource multiplyConverter}">
       <Binding Path="ActualHeight" ElementName="ExpanderContent"/>
       <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
Run Code Online (Sandbox Code Playgroud)

我想通过将结果存储ValueConverter到资源变量来删除此重复代码,以便我可以将此本地变量直接绑定到故事板.

<system:Double x:Key="CalculatedWidth">
    <MultiBinding Converter="{StaticResource multiplyConverter}">
        <Binding Path="ActualHeight" ElementName="ExpanderContent"/>
        <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
</system:Double >
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"Double"类型不支持直接内容.

无法将内容添加到"Double"类型的对象.

我觉得这是一个常见问题,但无法找到解决方案来消除这种冗余.

更新

谢谢Rohit,你的答案解决了这个问题.但我还有一个相关的问题,所以更新问题.这个变量CalculatedWidth在正常情况下工作正常,但是当它在RenderTransform中使用时,它不会获取值.即如果我使用正常的方式使用转换器它可以工作,但它不会获取变量.

<StackPanel.RenderTransform>
    <TranslateTransform x:Name="SliderTransform">
        <TranslateTransform.X>
            <Binding Converter="{StaticResource PanelConverter}" ElementName="SliderPanel" Path="ActualWidth" /> // Works
            <Binding Path="Width" Source="{StaticResource CalculatedWidth}"/> // Doesn't Work
        </TranslateTransform.X>
    </TranslateTransform>
</StackPanel.RenderTransform>
Run Code Online (Sandbox Code Playgroud)

我将变量保留为本地资源的一部分.这是否意味着在调用Render变换时不会创建变量?

c# wpf xaml ivalueconverter

6
推荐指数
1
解决办法
328
查看次数

具有MarkupExtension的IValueConverter

最近我读到了一个IValueConverter也继承自的东西MarkupExtension.它是这样的:

internal class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
    private static BoolToVisibilityConverter converter;
    public BoolToVisibilityConverter()
    {
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            if ((bool)value)
            {
                return Visibility.Visible;
            }
        }
        return Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            Visibility visibility = (Visibility)value;
            if (visibility == Visibility.Collapsed)
            {
                return false;
            }
        }
        return true;
    }
    public override …
Run Code Online (Sandbox Code Playgroud)

c# wpf converter markup-extensions ivalueconverter

6
推荐指数
2
解决办法
2073
查看次数