Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将WPF复选框绑定到条件?_C#_Wpf_Xaml_Binding_Conditional - Fatal编程技术网

C# 如何将WPF复选框绑定到条件?

C# 如何将WPF复选框绑定到条件?,c#,wpf,xaml,binding,conditional,C#,Wpf,Xaml,Binding,Conditional,查看模型 public class MyViewModel { public string MyProperty { get; set; } } XAML <CheckBox IsChecked="{Binding !MyProperty.Equals('Steve')}" /> 这可能吗?怎么做 很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它: public string MyProperty{get;s

查看模型

public class MyViewModel
{
    public string MyProperty { get; set; }
}
XAML

<CheckBox IsChecked="{Binding !MyProperty.Equals('Steve')}" />


这可能吗?怎么做

很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它:

public string MyProperty{get;set;}

public bool MyPropertyChecked
{
    get { return !MyProperty.Equals('Steve')}
}

很多人都会建议使用一种转换器,它肯定能工作。但我发现一个更快的方法是创建一个新的bool属性来使用并绑定到它:

public string MyProperty{get;set;}

public bool MyPropertyChecked
{
    get { return !MyProperty.Equals('Steve')}
}

这种事情可以在Xaml中完成(很多人说应该这样做),而不需要涉及视图模型的逻辑。若要查看其工作情况,请创建如下视图模型

public class ViewModel : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        [DebuggerStepThrough]
        get { return _myProperty; }
        [DebuggerStepThrough]
        set
        {
            if (value != _myProperty)
            {
                _myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}
<Grid>
    <CheckBox Content="Some check box">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="IsChecked" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding MyProperty}" Value="Steve">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</Grid>
然后将它绑定到某个Xaml上,看起来像这样

public class ViewModel : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        [DebuggerStepThrough]
        get { return _myProperty; }
        [DebuggerStepThrough]
        set
        {
            if (value != _myProperty)
            {
                _myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}
<Grid>
    <CheckBox Content="Some check box">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="IsChecked" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding MyProperty}" Value="Steve">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</Grid>

这是一个标准的WPF复选框,已使用数据触发器设置样式。每当“MyProperty”属性包含“Steve”时,触发器将IsChecked属性设置为true。否则CB将被取消选中(根据样式中的覆盖Setter)。它之所以有效,是因为触发器侦听VM的“MyProperty”中的更改。因此,可视化完全属于用户界面


触发器可以组合(甚至与模板选择器一起使用)来访问WPF内置的强大功能;它们将绑定到复选框上的任何依赖属性,如背景颜色等。

这种事情可以在Xaml中完成(许多人说应该这样做),而不涉及视图模型的逻辑。若要查看其工作情况,请创建如下视图模型

public class ViewModel : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        [DebuggerStepThrough]
        get { return _myProperty; }
        [DebuggerStepThrough]
        set
        {
            if (value != _myProperty)
            {
                _myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}
<Grid>
    <CheckBox Content="Some check box">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="IsChecked" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding MyProperty}" Value="Steve">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</Grid>
然后将它绑定到某个Xaml上,看起来像这样

public class ViewModel : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        [DebuggerStepThrough]
        get { return _myProperty; }
        [DebuggerStepThrough]
        set
        {
            if (value != _myProperty)
            {
                _myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
    }
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string name)
    {
        var handler = System.Threading.Interlocked.CompareExchange(ref PropertyChanged, null, null);
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}
<Grid>
    <CheckBox Content="Some check box">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="IsChecked" Value="False"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding MyProperty}" Value="Steve">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</Grid>

这是一个标准的WPF复选框,已使用数据触发器设置样式。每当“MyProperty”属性包含“Steve”时,触发器将IsChecked属性设置为true。否则CB将被取消选中(根据样式中的覆盖Setter)。它之所以有效,是因为触发器侦听VM的“MyProperty”中的更改。因此,可视化完全属于用户界面



触发器可以组合(甚至与模板选择器一起使用)来访问WPF内置的强大功能;它们将绑定到复选框上的任何依赖项属性,如背景色等。

您可以使用转换器来实现这一点,完全可以在Xaml中完成,无需代码。@GarryVass,这让我相信存在解决方案。@ShaunLuttin,我认为在Xaml中使用它更好,因为它使代码更不杂乱,更抽象…@ShaunLuttin,我添加了一个使用触发器的答案,这不是一个解决方法。看看这是否对你更有效。你可以使用一个转换器来实现这一点,它完全可以在Xaml中完成,而无需代码。@GarryVass这让我相信有一个解决方案存在。@ShaunLuttin,我认为在Xaml中完成它更好,因为它使代码更不杂乱,更抽象。@ShaunLuttin,我添加了一个答案,它使用的触发器不是一个解决方法。看看这对你是否更有效。这就是我最后做的。诀窍是使用
base.PropertyChanged(“MyProperty”)因此UI反映了更改。但这是另一个问题,它必须是双向绑定才能保留复选框的状态。因此,我为MyPropertyChecked添加了一个set属性。这就是我最终要做的。诀窍是使用
base.PropertyChanged(“MyProperty”)因此UI反映了更改。但这是另一个问题,它必须是双向绑定才能保留复选框的状态。因此,我为MyPropertyChecked.ok添加了一个set属性。这是有道理的。奇怪的是,我们如何使用元素来定义逻辑。“这似乎有悖常理。”ShaunLuttin,你必须和WPF的祖先们一起讨论这个问题。希望答案有帮助。很多代码是非直观的。我刚刚在我的代码中检查了你的答案,它工作得很好。我甚至检查了枚举相等性。谢谢,好的。这是有道理的。奇怪的是,我们如何使用元素来定义逻辑。“这似乎有悖常理。”ShaunLuttin,你必须和WPF的祖先们一起讨论这个问题。希望答案有帮助。很多代码是非直观的。我刚刚在我的代码中检查了你的答案,它工作得很好。我甚至检查了枚举相等性。谢谢