Int 数组中的值不会被 Slider (itemsControl) 更改
Values in Int Array aren't being changed by Slider (itemsControl)
我有一个 int 数组,我用它在 ItemsControl 中创建一组滑块。我在滑块上使用双向绑定,但从未设置数组(我在 setter 上放置了一个断点)。所有这些都在 UserControl 中。
用户控件XAML:
<ItemsControl ItemsSource="{Binding Values, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Width="30" MaxWidth="30">
<Slider Orientation="Vertical" Margin="5,0,0,0"
Value="{Binding Path=., Mode=TwoWay}"
Maximum="100"
Minimum="-100"
Height="100"/>
<TextBox Text="{Binding Path=., Mode=TwoWay}" Name="NumberTextBox" PreviewTextInput="NumberValidationTextBox"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
用户控件代码隐藏:
public int[] Values
{
get { return (int[])GetValue(ValuesProperty); }
set { SetValue(ValuesProperty, value); }
}
public static readonly DependencyProperty ValuesProperty =
DependencyProperty.Register("Values", typeof(int[]), typeof(Equalizer), new UIPropertyMetadata(new int[] { 0,0 }));
UserControl 在 MainWindow 中创建,并在其中提供值:
<local:Equalizer Margin="50" Height="20" Width="100" VerticalAlignment="Top"
MyText="{Binding TextData, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
MyProperty="True"
MinValue="{Binding MinValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
MaxValue="{Binding MaxValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
Values="{Binding Values, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}, Mode=TwoWay}"/>
好的,我找到办法了。不漂亮,但是很管用..
在 xaml 中,我像这样绑定到一个名为 "EQValues" 的集合:
<ItemsControl ItemsSource="{Binding EQValues, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Width="30" MaxWidth="30">
<Slider Orientation="Vertical" Margin="5,0,0,0"
Value="{Binding Value, Mode=TwoWay}"
Maximum="{Binding MaxValue, Mode=TwoWay}"
Minimum="{Binding MinValue, Mode=TwoWay}"
Height="100"/>
<TextBox Text="{Binding Value, Mode=TwoWay}"
Name="NumberTextBox"
PreviewTextInput="NumberValidationTextBox"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
然后在代码隐藏中,每当更改 int 数组时,我将此集合更改为等于 int 数组:
public int[] Values
{
get { return (int[])GetValue(ValuesProperty); }
set { SetValueDp(ValuesProperty, value); }
}
public static readonly DependencyProperty ValuesProperty =
DependencyProperty.Register("Values",
typeof(int[]),
typeof(Equalizer),
new FrameworkPropertyMetadata(OnValuesChanged));
public static void OnValuesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Get this specific Equalizer and call the UpdateCollection method
Equalizer myUserControl = (Equalizer)d;
myUserControl.UpdateCollection(e.NewValue as int[]);
}
void UpdateCollection(int[] intArr)
{
// Set EQValues to Values-Array, but as classes so ItemsControl can display it
EQValues = new ObservableCollection<EQItem>();
for (int i = 0; i < Values.Length; i++)
EQValues.Add(new EQItem(Values[i], MinValue, MaxValue));
}
然后我通过将集合转换回整数数组来保存集合数组:
// Convert EQValues into array
int[] arr = new int[EQValues.Count];
for (int i = 0; i < EQValues.Count; i++)
{
arr[i] = EQValues[i].Value;
}
// Set values to new values
Values = arr;
同样,不漂亮,但它有效:)。
我有一个 int 数组,我用它在 ItemsControl 中创建一组滑块。我在滑块上使用双向绑定,但从未设置数组(我在 setter 上放置了一个断点)。所有这些都在 UserControl 中。
用户控件XAML:
<ItemsControl ItemsSource="{Binding Values, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Width="30" MaxWidth="30">
<Slider Orientation="Vertical" Margin="5,0,0,0"
Value="{Binding Path=., Mode=TwoWay}"
Maximum="100"
Minimum="-100"
Height="100"/>
<TextBox Text="{Binding Path=., Mode=TwoWay}" Name="NumberTextBox" PreviewTextInput="NumberValidationTextBox"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
用户控件代码隐藏:
public int[] Values
{
get { return (int[])GetValue(ValuesProperty); }
set { SetValue(ValuesProperty, value); }
}
public static readonly DependencyProperty ValuesProperty =
DependencyProperty.Register("Values", typeof(int[]), typeof(Equalizer), new UIPropertyMetadata(new int[] { 0,0 }));
UserControl 在 MainWindow 中创建,并在其中提供值:
<local:Equalizer Margin="50" Height="20" Width="100" VerticalAlignment="Top"
MyText="{Binding TextData, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
MyProperty="True"
MinValue="{Binding MinValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
MaxValue="{Binding MaxValue, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}}"
Values="{Binding Values, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MainWindow}, Mode=TwoWay}"/>
好的,我找到办法了。不漂亮,但是很管用..
在 xaml 中,我像这样绑定到一个名为 "EQValues" 的集合:
<ItemsControl ItemsSource="{Binding EQValues, Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Width="30" MaxWidth="30">
<Slider Orientation="Vertical" Margin="5,0,0,0"
Value="{Binding Value, Mode=TwoWay}"
Maximum="{Binding MaxValue, Mode=TwoWay}"
Minimum="{Binding MinValue, Mode=TwoWay}"
Height="100"/>
<TextBox Text="{Binding Value, Mode=TwoWay}"
Name="NumberTextBox"
PreviewTextInput="NumberValidationTextBox"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
然后在代码隐藏中,每当更改 int 数组时,我将此集合更改为等于 int 数组:
public int[] Values
{
get { return (int[])GetValue(ValuesProperty); }
set { SetValueDp(ValuesProperty, value); }
}
public static readonly DependencyProperty ValuesProperty =
DependencyProperty.Register("Values",
typeof(int[]),
typeof(Equalizer),
new FrameworkPropertyMetadata(OnValuesChanged));
public static void OnValuesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Get this specific Equalizer and call the UpdateCollection method
Equalizer myUserControl = (Equalizer)d;
myUserControl.UpdateCollection(e.NewValue as int[]);
}
void UpdateCollection(int[] intArr)
{
// Set EQValues to Values-Array, but as classes so ItemsControl can display it
EQValues = new ObservableCollection<EQItem>();
for (int i = 0; i < Values.Length; i++)
EQValues.Add(new EQItem(Values[i], MinValue, MaxValue));
}
然后我通过将集合转换回整数数组来保存集合数组:
// Convert EQValues into array
int[] arr = new int[EQValues.Count];
for (int i = 0; i < EQValues.Count; i++)
{
arr[i] = EQValues[i].Value;
}
// Set values to new values
Values = arr;
同样,不漂亮,但它有效:)。