2015-08-04 4 views
0

Я хочу изменить ярлык привязки во время выполнения. Например, когда я нажимаю на первую кнопку, она устанавливает привязку к FirstLabel Property, когда нажимается вторая кнопка, она переходит на SecondLabel. Но это обновление только один раз, когда щелкнуть, если стрелять. Возможно ли каким-то образом обновить его динамическим?привязка динамического содержимого wpf

namespace WpfApplication113 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ReceiveData(); 
    } 
} 
public class ReceiveData : INotifyPropertyChanged 
{ 
    private double firstLabel; 

    private int secondLabel; 
    public double FirstLabel 
    { 
     get { return this.firstLabel;} 
     set { this.firstLabel = value; NotifyPropertyChanged("FirstLabel"); } 
    } 
    public int SecondLabel 
    { 
     get { return this.secondLabel; } 
     set { this.secondLabel = value; NotifyPropertyChanged("SecondLabel"); } 
    } 
    public ReceiveData() 
    { 
     Action StartUpdate = new Action(Count); 
     IAsyncResult result = StartUpdate.BeginInvoke(null, null); 
    } 
    public void Count() 
    { 
     while (true) 
     { 
      System.Threading.Thread.Sleep(1000); 
      FirstLabel += 0.1; 
      SecondLabel += 2; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 
} 

код Xaml:

<Grid> 
    <Label Content="{Binding FirstLabel}" HorizontalAlignment="Left" Margin="440,43,0,0" VerticalAlignment="Top"/> 
    <Label Content="{Binding SecondLabel}" HorizontalAlignment="Left" Margin="440,71,0,0" VerticalAlignment="Top"/> 
    <Label x:Name="TestLabel" Content="Label" HorizontalAlignment="Left" Margin="440,144,0,0" VerticalAlignment="Top"/> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="324,49,0,0" VerticalAlignment="Top" Width="75"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <ei:ChangePropertyAction TargetName="TestLabel" PropertyName="Content" Value="{Binding FirstLabel,UpdateSourceTrigger=PropertyChanged}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="324,77,0,0" VerticalAlignment="Top" Width="75"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Click"> 
       <ei:ChangePropertyAction TargetName="TestLabel" PropertyName="Content" Value="{Binding SecondLabel,UpdateSourceTrigger=PropertyChanged}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </Button> 

</Grid> 

ответ

1

WPF привязки данных не работает так, как вы, наверное, представить себе.

Вместо использования EventTrigger для обработки события Button.Click используйте команду и обновите значение свойства источника привязки.

<Label Content="{Binding FirstLabel}"/> 
<Label Content="{Binding SecondLabel}"/> 
<Label Content="{Binding TestLabel}"/> 
<Button Content="Button" Command="{Binding SetTestLabelCommand}" CommandParameter="{Binding FirstLabel}"/> 
<Button Content="Button" Command="{Binding SetTestLabelCommand}" CommandParameter="{Binding SecondLabel}"/> 

Code-за:

public ICommand SetTestLabelCommand { get; set; } 

string _testLabel; 
public string TestLabel 
{ 
    get 
    { 
     return _testLabel; 
    } 
    set 
    { 
     _testLabel = value; 
     RaisePropertyChanged("TestLabel"); 
    } 
} 

string _firstLabel; 
public string FirstLabel 
{ 
    get 
    { 
     return _firstLabel; 
    } 
    set 
    { 
     _firstLabel= value; 
     RaisePropertyChanged("FirstLabel"); 
    } 
} 

string _secondLabel; 
public string SecondLabel 
{ 
    get 
    { 
     return _secondLabel; 
    } 
    set 
    { 
     _secondLabel= value; 
     RaisePropertyChanged("SecondLabel"); 
    } 
} 

SetTestLabelCommand = new RelayCommand<string>(SetTestLabel); 

private void SetTestLabel(string value) 
{ 
    TestLabel = value; 
} 
+0

После выполнения "SetTestLabelCommand" TestLabel Обновит только один раз. – A191919

+0

Я не понимаю ... Когда вы нажимаете первую кнопку, TestLabel имеет содержимое FirstLabel, при нажатии второй кнопки TestLabel имеет контент SecondLabel. Разве это не то, что вы хотите? –

+0

Я хочу, чтобы «TestLabel» обновлялся со значением First или SecondLabel – A191919

Смежные вопросы