3

我试图解决我无法为ConverterParameter. 请参阅我的另一个问题,了解为什么我需要将动态值绑定到ConverterParameter- 我不喜欢当前发布的解决方案,因为它们都需要我认为应该对我的视图模型进行不必要的更改。

为了尝试解决这个问题,我创建了一个自定义转换器,并在该转换器上公开了一个依赖属性:

public class InstanceToBooleanConverter : DependencyObject, IValueConverter
{
    public object Value
    {
        get { return (object)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(InstanceToBooleanConverter), null);

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null && value.Equals(Value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.Equals(true) ? Value : Binding.DoNothing;
    }
}

有没有办法在我的 XAML 中使用绑定(或样式设置器或其他疯狂的方法)来设置此值?

<ItemsControl ItemsSource="{Binding Properties}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:SomeClass}">
            <DataTemplate.Resources>
                <!-- I'd like to set Value to the item from ItemsSource -->
                <local:InstanceToBooleanConverter x:Key="converter" Value="{Binding Path=???}" />
            </DataTemplate.Resources>
<!- ... ->

到目前为止,我看到的示例仅绑定到静态资源。

编辑:

我收到一些反馈,说我发布的 XAML 只有一个转换器实例。

我可以通过将资源置于我的控制中来解决此问题:

<ItemsControl ItemsSource="{Binding Properties}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:SomeClass}">
            <RadioButton Content="{Binding Name}" GroupName="Properties">
                <RadioButton.Resources>
                    <!-- I'd like to set Value to the item from ItemsSource -->
                    <local:InstanceToBooleanConverter x:Key="converter"
                                                      Value="{Binding Path=???}" />
                </RadioButton.Resources>
                <RadioButton.IsChecked>
                    <Binding Path="DataContext.SelectedItem"
                             RelativeSource="{RelativeSource AncestorType={x:Type Window}}"
                             Converter="{StaticResource converter}" />
                </RadioButton.IsChecked>
            </RadioButton>
<!- ... ->

所以这个问题不会因为必须共享转换器的实例而被阻止:)

4

2 回答 2

1

不幸的是,这行不通-我以前一直在这条路上,结果是 ItemsControl 中的所有项目都共享同一个转换器。我认为这是由于 XAML 解析器的工作方式。

于 2011-05-05T20:35:23.240 回答
0

首先,您可以在更高级别的资源字典中指定转换器并将其设置x:Sharedfalse,其次,如果您想要“将值设置为 ItemsSource 中的项目”,如您所注释的,您只需指定一个空绑定 ( Value="{Binding}")。

于 2011-05-05T21:41:41.607 回答