Возможно я плохо объяснил суть проблемы.
Вот обещанный код (это просто пример):
Слайдер с корректируемым значением:
<UserControl x:Class="WpfApplication1.MySlider"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="auto" Width="auto"
Name="mySlider">
<Grid>
<Slider Height="22" Width="120" Name="slider1"
Value="{Binding Value, ElementName=mySlider, Mode=TwoWay}" />
</Grid>
</UserControl>
Code Behind:
public partial class MySlider : UserControl
{
public MySlider()
{
InitializeComponent();
}
public decimal Value
{
get
{
return (decimal) GetValue(ValueProperty);
}
set
{
SetValue(ValueProperty, value);
}
}
public static DependencyProperty ValueProperty =
DependencyProperty.Register("Value",
typeof (decimal),
typeof (MySlider),
new FrameworkPropertyMetadata((decimal) 0, null,CoerceValueCallback));
private static object CoerceValueCallback(DependencyObject d, object basevalue)
{
return Math.Round((decimal) basevalue, 2);
}
}
Его использование:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Grid>
<my:MySlider x:Name="mySlider" Height="27" VerticalAlignment="Top" Margin="28,60,119,0"
Value="{Binding Value, Mode=TwoWay}"/>
<TextBox Margin="28,125,130,114" Name="textBox1" Text="{Binding Value}" />
</Grid>
</Window>
Code Behind:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new Data {Value = 5};
}
}
public class Data
{
public decimal Value
{
get;
set;
}
}
В этом случае в TextBox`е мы видим значение не скорректированое (Slider выступает как цель привязки)
Если же:
<TextBox Margin="28,125,130,114" Name="textBox1" Text="{Binding Value, ElementName=mySlider}" />
то видим то, что и ожидалось — значение округляется. В этом случае Slider — источник данных.
Что это, баг или фича? И что теперь с этим делать?