WPF TwoWay ограничение привязки данных - PullRequest
1 голос
/ 29 октября 2009

Можно ли предположить, что привязка данных WPF TwoWay Не работает с элементами управления, которые не имеют фокуса?

Например, в следующем коде.

 <Window.Resources>
        <XmlDataProvider x:Key="TestBind1" XPath="/BindTest1">
            <x:XData>
                <BindTest1 xmlns="">
                    <Value1>True</Value1>
                </BindTest1>
            </x:XData>
        </XmlDataProvider>
    </Window.Resources>
    <StackPanel>
        <GroupBox>
            <StackPanel>
                <RadioButton Content="Value1" IsChecked="{Binding Source={StaticResource TestBind1},Mode=TwoWay, XPath=Value1}"/>
                <RadioButton Content="Value2"/>
            </StackPanel>
         </GroupBox>
        <Button Content="Analyse" Click="OnAnalyseClicked"/>

    </StackPanel>

Когда я нажимаю на значение радиокнопки Value2, значение BindTest1 / Value1 остается true , поскольку значение радиокнопки Value1 изменилось, хотя оно не имело фокус?

Это нормальное поведение для WPF? Мне известно, что я могу избежать этого, используя различные методы, но я хотел спросить, нормально ли это, или в моем Xaml отсутствует какой-либо параметр, вызывающий эту проблему.

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

Наконец-то я нашел ответ. По сути, привязка для RadioButtons будет прерываться, потому что каждый раз, когда вы изменяете ее привязку, radiobuttons изменяет проверенное состояние других кнопок группы

Я нашел ответ здесь , который специализируется на RadioButton и предотвращает изменение привязки.

Пример класса, который я использовал для исправления привязки.

 /// <summary>
    /// data bound radio button
    /// </summary>
    public class DataBoundRadioButton : RadioButton
    {
        /// <summary>
        /// Called when the <see cref="P:System.Windows.Controls.Primitives.ToggleButton.IsChecked"/> property becomes true.
        /// </summary>
        /// <param name="e">Provides data for <see cref="T:System.Windows.RoutedEventArgs"/>.</param>
        protected override void OnChecked(RoutedEventArgs e)
        {
            // Do nothing. This will prevent IsChecked from being manually set and overwriting the binding.
        }

        /// <summary>
        /// Called by the <see cref="M:System.Windows.Controls.Primitives.ToggleButton.OnClick"/> method to implement a <see cref="T:System.Windows.Controls.RadioButton"/> control's toggle behavior.
        /// </summary>
        protected override void OnToggle()
        {
            BindingExpression be = GetBindingExpression(RadioButton.IsCheckedProperty);
            Binding bind = be.ParentBinding;

            Debug.Assert(bind.ConverterParameter != null, "Please enter the desired tag as the ConvertParameter");

            XmlDataProvider prov = bind.Source as XmlDataProvider;
            XmlNode node = prov.Document.SelectSingleNode(bind.XPath);
            node.InnerText = bind.ConverterParameter.ToString();

        }
    }
1 голос
/ 29 октября 2009

Привязки будет обновляться независимо от того, имеют ли элементы управления фокус. Я думаю, что в вашем XAML что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...