IMul​​tiValueConverter总是在DependencyProperty.UnsetValue中传递列表

时间:2012-06-18 16:56:42

标签: c# .net wpf .net-3.5

我有一个滑块控件,可以选择列表中的元素。我需要显示所选元素的ToString()。我遇到的问题是values函数中IMultiValueConverter.Convert的值始终具有values[0]的正确值,但values[1]始终为DependencyProperty.UnsetValue。在绑定中我做错了什么?

这是我的XAML

<Window x:Class="VetWebConnectorWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:VetWebConnectorWPF"
        <!--Snip-->
        >
    <Grid>
    <!--Snip-->
        <GroupBox Grid.Row="1" Height="Auto" Header="Display configuration">
            <Grid>
                <!--Snip-->
                <Grid Grid.Row="1" Width="200">
                    <!--Snip-->
                    <Slider Name="sldrResoultion" Grid.Column="1" TickPlacement="BottomRight" Minimum="0" Maximum="{Binding ElementName=lstResoultions, Path=Count}" TickFrequency="1"
                                        IsSnapToTickEnabled="True"/>
                </Grid>
                <Label Name="lblResoultionDisplay" Grid.Row="2" HorizontalAlignment="Center">
                    <Label.Resources>
                        <local:ResoutionConverter x:Key="resoutionConverter" />
                    </Label.Resources>
                    <Label.Content>
                        <MultiBinding Converter="{StaticResource resoutionConverter}">
                            <Binding ElementName="sldrResoultion" Path="Value" />
                            <Binding ElementName="lstResoultions" />
                        </MultiBinding>
                    </Label.Content>
                </Label>
            </Grid>
        </GroupBox>
    </Grid>
</Window>

这是MainWindow的代码隐藏

namespace VetWebConnectorWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.lstResoultions = new List<object>();

            AddResoution(new Resoultion(1024, 768));
            AddResoution(new Resoultion(1366, 768));
            AddResoution(new Resoultion(1280, 960));
            AddResoution(new Resoultion(1440, 900));
            AddResoution(new Resoultion(1280, 1024));
            AddResoution(new Resoultion(1600, 900));
            AddResoution(new Resoultion(1400, 1050));
            AddResoution(new Resoultion(1440, 1080));
            AddResoution(new Resoultion(1600, 1200));
            AddResoution(new Resoultion(1920, 1080));
            AddResoution(new Resoultion(1920, 1200));
            AddResoution(new Resoultion(2048, 1152));
            AddResoution(new Resoultion(2560, 2048));
            AddResoution(new Resoultion(3200, 2048));

            this.lstResoultions.Add("Full Screen");

        }

        readonly List<object> lstResoultions;

        //(Snip)
    }
}

以下是Resoultion.cs的代码

namespace VetWebConnectorWPF
{
    public class Resoultion
    {
        public Resoultion(int width, int height)
        {
            this.Width = width;
            this.Height = height;
        }

        public int Width { get; private set; }
        public int Height { get; private set; }

        public override string ToString()
        {
            return string.Concat(this.Width, " x ", this.Height);
        }
    }

    class ResoutionConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (values == null || values.Length != 2)
                return null;

            double? idx = values[0] as double?;
            object[] resoultions = values[1] as object[];

            if (!idx.HasValue || resoultions == null)
                return null;

            return resoultions[System.Convert.ToInt32(idx.Value)];
        }

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

1 个答案:

答案 0 :(得分:3)

我没有在您的XAML中看到名为lstResoultions

的任何元素

DependencyProperty.UnsetValue是WPF的属性系统使用而不是null来表示该属性存在,但它没有值