有人知道是否可以在基于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属性包含一个实际的非空集合,所以这不是问题.
两者都没有关于输出日志中的绑定的错误消息.
有线索吗?
我正在测试我构建的用户控件,我遇到的东西对我来说是莫名其妙的.
该控件是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 …
目前我正在使用整数作为ConverterParameter,并将其转换Enum为Converter.我发现它非常难以理解XAML.
我想知道是否有办法Enum在资源部分声明并将其值传递给它ConverterParameter?
我发现了一个问题,询问如何避免向自己的应用程序资源添加自定义值转换器:
但是我想超越它并注册那些隐含的转换器,如下例所示:
<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自动使用它而不在绑定表达式中指定转换器?
我没有实现的问题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)
这会让我感兴趣:
感谢您的提示!
我有一个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) 我在用户界面中使用WPF和MVVM模式.在我的ViewModel中,我有一个List,其中包含以毫米为单位的距离,我通过将ListView.ItemsSource绑定到List来显示在ListView中.但是,我希望显示的值使用更自然的单位 - 米或英尺,具体取决于"公制"复选框的状态.
我写了几个简单的类,MillimetresToMetresConverter和MillimetresToFeetConverter,它们都实现了IValueConverter.虽然我可以将我的数据绑定上的Converter属性设置为一个或另一个,但我不确定当复选框的状态发生变化时如何在这些转换器之间进行更改.
我的计划是在我的ViewModel上有一个字段"IValueConverter lengthConverter",我可以设置为一个转换器或另一个,然后在我的XAML中...="{Binding Converter={Binding Path=lengthConverter}}"- 遗憾的是这不起作用,因为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) 我有一个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变换时不会创建变量?
最近我读到了一个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) ivalueconverter ×10
wpf ×10
c# ×5
binding ×3
xaml ×3
.net ×2
data-binding ×2
converter ×1
converters ×1
msdn ×1
mvvm ×1