我试图将2个不同的WPF控件绑定到ViewModel中的相同属性,一个CheckBox.IsChecked和一个Expander.IsExpanded.我想要实现的行为是让CheckBox影响ViewModel(因此也影响Expander),但不影响其他方式.就像是:
Checkbox Checked -> ViewModel property set to frue -> Expander.Expand
Checkbox Unchecked -> ViewModel property set to false -> Expander.Collapse
Expander Expanded -> Nothing else affected
Expander Collapsed -> Nothing else affected
Run Code Online (Sandbox Code Playgroud)
这是XAML:
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Expander IsExpanded="{Binding IsChecked, Mode=OneWay}">
<Expander.Header>
<CheckBox IsChecked="{Binding IsChecked}" Content="Is Checked"/>
</Expander.Header>
<TextBlock Text="Expanded!"/>
</Expander>
</Window>
Run Code Online (Sandbox Code Playgroud)
和守则:
using System.ComponentModel;
using System.Windows;
namespace WpfApplication9
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class ViewModel: INotifyPropertyChanged
{
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
NotifyPropertyChange("IsChecked");
}
}
protected void NotifyPropertyChange(string PropertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,只要我点击Expander展开/折叠它,Binding就会停止工作.任何人都可以向我解释为什么会发生这种情况,我该如何实现这一目标?提前致谢!
Rac*_*hel 13
新答案
发现你可以通过设置你这样做UpdateSourceTrigger对Explicit你的扩展.这使绑定保持为双向,但永远不会更新源,因为除非您明确告诉它,否则不要更新源.
<Expander IsExpanded="{Binding IsChecked, UpdateSourceTrigger=Explicit}">
<Expander.Header>
<CheckBox IsChecked="{Binding IsChecked}" Content="Is Checked"/>
</Expander.Header>
<TextBlock Text="Expanded!"/>
</Expander>
Run Code Online (Sandbox Code Playgroud)
留下我的旧答案,以便评论有意义,因为我仍然觉得视图特定代码在视图的代码隐藏中没有问题:)
老答案
就个人而言,这是特定于视图的代码,我发现使用CheckBox点击事件设置Expander的IsExpanded值没有问题.
private void MyCheckBox_Click(object sender, RoutedEventArgs e)
{
MyExpander.IsExpanded = ((CheckBox)sender).IsChecked.GetValueOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
您可以通过删除名称并导航Visual Tree来查找与CheckBox关联的Expander来使其更加通用.这是使用我构建的一些Visual Tree Helpers的示例
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
var chk = (CheckBox)sender;
var expander = VisualTreeHelpers.FindAncestor<Expander>(chk);
if (expander != null)
expander.IsExpanded = chk.IsChecked.GetValueOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |