Re: Binding в WPF
От: Аноним  
Дата: 21.07.09 14:09
Оценка:
Возможно я плохо объяснил суть проблемы.
Вот обещанный код (это просто пример):

Слайдер с корректируемым значением:

<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 — источник данных.

Что это, баг или фича? И что теперь с этим делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.