2016-07-05 5 views
-1

Итак, у меня есть ComboBox, связанный со списком элементов. {A, B, C, D, E}TextBox isEnabled привязка зависит от элемента combobox

<ComboBox x:Name="cmbDMS" ItemsSource="{Binding Types}" SelectedValue="{Binding Type,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" SelectionChanged="cmbDMS_SelectionChanged" /> 

также текстовое поле.

<TextBox IsEnabled="{Binding isTypeB}" Grid.Row="6" Width="250" Margin="0,2" /> 

Я не могу понять, как обновить свойство TextBox IsEnabled когда ComboBox SelectedValue изменился на B. Он работает, как только я выйти и вернуться в поле зрения, но я хочу, чтобы это было мгновенным.

Спасибо.

+0

Что такое "isTypeB"? Вы ошиблись это для [другого сайта] (http://www.psychicfriendsnetwork.com)? –

ответ

1

У меня были проблемы в прошлом с привязкой к SelectedValue, и это правильно поднимало события. Если у вас нет явной причины, я хотел бы связываться с SelectedItem

Вопрос я нашел с этой операцией, является то, что привязка к bool объекта не обязательно обновляется через изменения в SelectedItem в ComboBox

Если вы хотели бы два, чтобы быть связаны между собой, простой способ сделать это, чтобы поднять собственности измененное событие для bool isTypeB собственности в инкубаторе в Собственость:

(как я не знаю, тип «Тип» я буду считать, что это строка):

public string Type 
{ 
    get{...} 
    set 
    { 
    //...set logic 
    RaisePropertyChanged(); //will notify when "Type" changes 
    RaisePropertyChanged("isTypeB"); //will notify that isTypeB is changed 
    } 
} 
... 
public bool isTypeB => Type == "TypeB"; 

Ссылка для RaisePropertyChanged:

public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
0

Если ваше связывание работает в первый раз, а затем оно не появляется, ваше уведомление об изменении свойства может не сработать. Поэтому убедитесь, что вы привязываетесь к свойству DependencyProperty, или в своем сеттере вы вызываете событие PropertyChanged (член интерфейса INotifyPropertyChanged).

2

Я сделал образец для вас, чтобы понять это. Поскольку это более основанная на взгляде вещь, я предлагаю использовать конвертер и включать код в представление и сам конвертер. См. Код ниже. Я тестировал его, и он отлично работает в конце.

Когда вы выбираете B, текстовое поле включено, когда выбор изменяется на любой другой, текстовое поле отключено.

XAML Код:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns:viewModel="clr-namespace:WpfApplication1.ViewModel" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" > 
    <Window.Resources> 
     <viewModel:TestConverter x:Key="TestConverter" /> 
    </Window.Resources> 
    <Grid Margin="329,0,0,0"> 
     <ComboBox x:Name="cmbDMS" HorizontalAlignment="Left" VerticalAlignment="top" Width="120" > 
      <ComboBoxItem Content="A"/> 
      <ComboBoxItem Content="B"/> 
      <ComboBoxItem Content="C"/> 
      <ComboBoxItem Content="D"/> 
      <ComboBoxItem Content="E"/> 
     </ComboBox> 
     <TextBox Grid.Row="6" Height="60" Width="250" Margin="0,2" IsEnabled="{Binding ElementName=cmbDMS, Path=Text, Converter={StaticResource TestConverter}}" /> 
    </Grid> 
</Window> 

TestConverter.cs Код:

using System; 
using System.Globalization; 
using System.Windows.Data; 

namespace WpfApplication1.ViewModel 
{ 
    public class TestConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value != null) 
      { 
       var si = value.ToString(); 
       if (si.Equals("B")) 
        return true; 
      } 
      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
}