WPF:更改所有数据绑定的路径

WPF:更改所有数据绑定的路径,wpf,xaml,data-binding,Wpf,Xaml,Data Binding,当用户单击按钮时,我试图更改窗口中的所有数据绑定。 注意:以下代码是伪代码。 假设我们有一个名为sensor的类: public class Sensor : INotifyPropertyChanged { public int HighVal {get; set;} public int LowVal {get; set;} } 以及我们所绑定的以下模型: public class SomeModel { public Sensor MovementSensor {get; s

当用户单击按钮时,我试图更改窗口中的所有数据绑定。 注意:以下代码是伪代码。

假设我们有一个名为sensor的类:

public class Sensor : INotifyPropertyChanged {
  public int HighVal {get; set;}
  public int LowVal {get; set;}
}
以及我们所绑定的以下模型:

public class SomeModel {
  public Sensor MovementSensor {get; set;}
  public Sensor TemperatureSensor {get; set;}
  public Sensor BarometerSensor {get; set;}
}
在我的xaml中,我希望以以下方式绑定:

<TextBox Text="{Binding MyModel.MovementSensor.HighVal}"/>
<TextBlock Text="{Binding MyModel.BarometerSensor.HighVal}"/>

我想有一个按钮(或类似的东西),点击后,将改变所有数据绑定的路径从HighVal到LowVal,例如

<TextBox Text="{Binding MyModel.MovementSensor.LowVal}"/>
<TextBlock Text="{Binding MyModel.BarometerSensor.LowVal}"/>

有没有一种优雅的方法可以在不遍历窗口中所有数据绑定的情况下执行此操作


谢谢

您可以使用与传感器的两个值和第三个属性连接的多重绑定来确定当前值:

<TextBlock>
    <TextBlock.Resources>
        <y:SensorValueConverter x:Key="SVC"></y:SensorValueConverter>
    </TextBlock.Resources>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource SVC}">            
            <Binding Path="MyModel.BarometerSensor.HighVal" />
            <Binding Path="MyModel.BarometerSensor.LowVal" />
            <Binding Path="MyModel.BarometerSensor.SelectedVal" />    
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
现在最重要的部分是绑定的ValueConverter,它将根据SelectedVal的状态选择正确的值(class
CultureInfo
是System.Globalization命名空间):

要更改传感器的选定值,需要修改SelectedVal属性:

MyModel.BarometerSensor.SelectedVal = SelectedValue.Low
<Style x:Key="SpecialValStyle" TargetType="TextBlock">
    <Setter Property="Text">            
        <Binding Path="MyModel.BarometerSensor.HighVal" />
    </Setter>
</Style>
更新:
要将绑定分配给多个元素,可以在单独的文件(Styles.xaml)中定义样式:


要从其他窗口使用此样式,只需在窗口的资源中添加以下行:

<ResourceDictionary Source="Styles.xaml"></ResourceDictionary>

最后,您需要将创建的样式指定给所有应显示值的文本块:

<TextBlock Style="{StaticResource ValStyle}"></TextBlock>

对于只有一个属性的传感器,可以在Styles.xaml中创建另一个样式,该样式必须仅绑定到一个属性:

MyModel.BarometerSensor.SelectedVal = SelectedValue.Low
<Style x:Key="SpecialValStyle" TargetType="TextBlock">
    <Setter Property="Text">            
        <Binding Path="MyModel.BarometerSensor.HighVal" />
    </Setter>
</Style>


首先,感谢您的回答。有几点是有问题的:1。一个窗口将影响另一个窗口-例如,如果在一个窗口上“SelectedVal”将更改为“Low”,它将影响显示相同数据的其他窗口。2.开发笨拙-我的应用程序由几十个显示各种传感器的窗口组成。我需要将每个xaml绑定从我的问题中显示的简单语法更改为您的答案中显示的语法。我们如何克服这些挑战?挑战1可以通过在每个窗口中放置“SelectedVal”来解决。挑战2:你可以为文本框创建一个样式,并将所有bindung内容放在那里。那么您只需要声明一次绑定。我可以问一个#2的例子吗?如何(通过全局样式)访问单个文本框中的绑定集?还有一个问题:你会如何处理一个只有“HighVal”而没有“LowVal”的“特殊传感器”的情况?再次感谢您的帮助!我在我的帖子里放了一个例子和一个答案。我希望这对你有帮助。我看过了,但它并没有真正解决问题。我需要类似于styles.xaml中定义的转换器的东西,multi绑定到:a。窗口b的SelectedVal。用户将在特定文本框上使用的原始绑定-本质上,全局转换器对于用户可以定义的每个文本框都应该是全局的;用户应该能够编写如下内容:和(使用相同的转换器),我将添加一个名为
DisplayValue
的值,并让按钮切换模型中的一个属性,如果它返回
HighVal
LowVal
,就会触发该属性。这似乎是比在您的视图中使用这样的逻辑更好的MVVM方法:)@Rachel:这会导致显示模型不同部分的多个窗口受到影响,但这不是所需要的。我只需要一个选项来实际更改当前视图。
<TextBlock Style="{StaticResource ValStyle}"></TextBlock>
<Style x:Key="SpecialValStyle" TargetType="TextBlock">
    <Setter Property="Text">            
        <Binding Path="MyModel.BarometerSensor.HighVal" />
    </Setter>
</Style>