2013-06-08 4 views
4

글쎄,이 질문 쉬운 수 있습니다 있지만이 솔루션을 찾을 수 없습니다. WPF DataTrigger 값으로 바인딩

나는 이제 변수 myVariableValue을 결합하려는 DataTrigger
<DataTrigger Binding="{Binding Quantity}" Value="0"> 

으로합니다. 따라서 myVariable 값이 변경되면 DataTrigger의 Value 속성도 변경됩니다.

바인딩 설정을 시도했지만 설정이 불가능합니다. 이 값을 동적으로 설정할 수있는 다른 방법이 있습니까?

편집 : 내 데이터 트리거를 만들려고했습니다. 그러나 나는 여전히 일을 할 수 없다.

DataTrigger d = new DataTrigger(); 
d.Binding = new Binding("Quantity"); 
d.Value = 1; 
Setter s = new Setter(BackgroundProperty, Brushes.Red); 
d.Setters.Add(s); 

Style st = new Style(typeof(DataGridRow)); 
st.Triggers.Add(d); 
this.Resources.Add(this.Resources.Count, st); 

내가 XAML

<Page.Resources> 
    <Style TargetType="DataGridRow"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Quantity}" Value="1"> 
       <Setter Property="Background" Value="Red" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Page.Resources> 

감사를 다음의 장소에 위의 코드를 사용하려면 :

는 코드입니다.

+0

'DataTrigger.Value'는 종속성 속성이 아니므로 직접 작동하지 않으므로 약간의 트릭이 필요합니다. – Vlad

+0

알아요,하지만 어떻게? 프로그래밍 방식으로'DataTrigger '를 작성할 수 있습니까? –

+0

예를 들어'Multibinding'과 변환기를 특징으로하는 [이 답변] (http://stackoverflow.com/a/2244222/276994)을보십시오. – Vlad

답변

4

내 문제를 이해하려면보기 모델의 속성 중 하나의 값에 따라 DataTriggerValue을 설정하는 방법을 찾으려고합니다. 그래서 여기에 해결책이 있습니다. 여기

은보기 모델

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; 
    } 

트릭은 ValueConverterCandidateValueProperty라는 이름의 종속성 속성을 가지고 있다는 것입니다. 이 속성은 뷰 모델 CandidateValue에 바인딩됩니다. 따라서 입력 값이 뷰 모델의 CandidateValue와 같으면 TextBox의 전경색이 빨간색이됩니다.