2012-06-18 27 views
0

我有一個滑塊控件,將選擇一個列表中的元素。我需要顯示所選元素的ToString()。我遇到的問題是values的值在我的IMultiValueConverter.Convert函數中始終有一個正確的值values[0],但values[1]總是DependencyProperty.UnsetValue。我在綁定中做錯了什麼?IMultiValueConverter總是通過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> 

這裏是我的主窗口

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(); 
     } 
    } 
} 

回答

3

我沒有看到任何元素在您的XAML中命名爲lstResoultions

DependencyProperty.UnsetValue是什麼WPF的屬性系統使用,而不是null,表明屬性存在,但它不具有價值

+0

lstResoultions在代碼隱藏文件'只讀目錄定義lstResoultions' –

+0

@ScottChamberlain那不是東西UI可以在運行時查找。 'ElementName'綁定通過可視樹來查找具有特定名稱的元素,並且在您的情況下,可視樹中沒有名爲'lstResolutions'的元素。 – Rachel

+0

我需要做什麼才能允許綁定lstResoultions? –