내 문제를 이해하려면보기 모델의 속성 중 하나의 값에 따라 DataTrigger
의 Value
을 설정하는 방법을 찾으려고합니다. 그래서 여기에 해결책이 있습니다. 여기
은보기 모델
public class ViewModel : INotifyPropertyChanged
{
private string _text;
private string _candidateValue;
public string Text
{
get
{
return this._text;
}
set
{
this._text = value;
if (null != PropertyChanged)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}
public string CandidateValue
{
get
{
return this._candidateValue;
}
set
{
this._candidateValue = value;
if (null != PropertyChanged)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("Text"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
입니다 그리고 당신은 당신이 DataTrigger
의
public class ValueConverter : DependencyObject, IValueConverter
{
public static readonly DependencyProperty CandidateValueProperty = DependencyProperty.Register("CandidateValue", typeof(string), typeof(ValueConverter));
public string CandidateValue
{
get { return (string)GetValue(CandidateValueProperty); }
set { SetValue(CandidateValueProperty, value); }
}
public ValueConverter()
: base()
{
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (null != value)
{
if (value.ToString() == this.CandidateValue)
return true;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
바인딩에 IValueConverter 필요 그리고 XAML 당신은 만들 필요가
<TextBox x:Name="TextBox" Text="{Binding Text,UpdateSourceTrigger=PropertyChanged}">
</TextBox>
매우 간단합니다 귀하의 datatrigger 코드 뒤에. 여기
public MainWindow()
{
InitializeComponent();
//The view model object
ViewModel vm = new ViewModel();
vm.CandidateValue = "1";
this.DataContext = vm;
//create data trigger object for TextBox
DataTrigger d = new DataTrigger();
//create binding object for data trigger
Binding b = new Binding("Text");
ValueConverter c = new ValueConverter();
b.Converter = c;
//create binding object for ValueConverter.CandidateValueProperty
Binding convertBinding = new Binding("CandidateValue");
convertBinding.Source = vm;
BindingOperations.SetBinding(c, ValueConverter.CandidateValueProperty, convertBinding);
d.Binding = b;
d.Value = true;
Setter s = new Setter(TextBox.ForegroundProperty, Brushes.Red);
d.Setters.Add(s);
Style st = new Style(typeof(TextBox));
st.Triggers.Add(d);
this.TextBox.Style = st;
}
트릭은 ValueConverter
이 CandidateValueProperty
라는 이름의 종속성 속성을 가지고 있다는 것입니다. 이 속성은 뷰 모델 CandidateValue
에 바인딩됩니다. 따라서 입력 값이 뷰 모델의 CandidateValue와 같으면 TextBox의 전경색이 빨간색이됩니다.
'DataTrigger.Value'는 종속성 속성이 아니므로 직접 작동하지 않으므로 약간의 트릭이 필요합니다. – Vlad
알아요,하지만 어떻게? 프로그래밍 방식으로'DataTrigger '를 작성할 수 있습니까? –
예를 들어'Multibinding'과 변환기를 특징으로하는 [이 답변] (http://stackoverflow.com/a/2244222/276994)을보십시오. – Vlad