Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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# 将按钮IsEnabled属性绑定到DataTemplate项状态和一个附加条件_C#_Wpf - Fatal编程技术网

C# 将按钮IsEnabled属性绑定到DataTemplate项状态和一个附加条件

C# 将按钮IsEnabled属性绑定到DataTemplate项状态和一个附加条件,c#,wpf,C#,Wpf,我有一个具有可编辑参数集合的对象,该集合作为ItemsSource绑定到ItemsControl,还有一个检查所有参数值是否正常的属性。此属性绑定到按钮的已启用 我还想在任何textbox出现验证错误(validation.HasError==true)时禁用该按钮 提前谢谢 XAML: 好啊 代码: using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using Syst

我有一个具有可编辑参数集合的对象,该集合作为
ItemsSource
绑定到
ItemsControl
,还有一个检查所有参数值是否正常的属性。此属性绑定到按钮的
已启用

我还想在任何textbox出现验证错误(validation.HasError==true)时禁用该按钮

提前谢谢

XAML:


好啊
代码:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;

namespace MyWPFTest
{
public partial class MainWindow : Window
{
    ObjectWithParameters _MyObject = new ObjectWithParameters();
    public ObjectWithParameters MyObject { get { return _MyObject; } }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }
}

public class ObjectWithParameters : INotifyPropertyChanged
{
    ObservableCollection<Parameter> _Parameters = new ObservableCollection<Parameter>();
    public ObservableCollection<Parameter> Parameters { get { return _Parameters; } }
    public event PropertyChangedEventHandler PropertyChanged;
    public ObjectWithParameters()
    {
        var p1 = new Parameter("Parameter 1", 0); p1.PropertyChanged += ParameterChanged; Parameters.Add(p1);
        var p2 = new Parameter("Parameter 2", 0); p2.PropertyChanged += ParameterChanged; Parameters.Add(p2);
    }
    void ParameterChanged(object sender, PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsParametersOkay"));
    }
    public bool IsParametersOkay
    {
        get { return Parameters.FirstOrDefault(p => p.Value < 0) == null; }
    }
}

public class Parameter : INotifyPropertyChanged
{
    double val; 
    public double Value 
    { 
        get { return val; } 
        set { val = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); } 
    }
    public string Name { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
    public Parameter(string name, double value) { Name = name; Value = value; }
}
}
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Linq;
使用System.Windows;
命名空间MyWPFTest
{
公共部分类主窗口:窗口
{
ObjectWithParameters_MyObject=新建ObjectWithParameters();
参数为MyObject{get{return}MyObject;}的公共对象
公共主窗口()
{
初始化组件();
DataContext=this;
}
}
带有参数的公共类对象:INotifyPropertyChanged
{
ObservableCollection_参数=新的ObservableCollection();
公共ObservableCollection参数{get{return\u Parameters;}}
公共事件属性更改事件处理程序属性更改;
公共对象WithParameters()
{
变量p1=新参数(“参数1”,0);p1.PropertyChanged+=参数已更改;Parameters.Add(p1);
var p2=新参数(“参数2”,0);p2.PropertyChanged+=参数已更改;Parameters.Add(p2);
}
void参数已更改(对象发送方,PropertyChangedEventArgs e)
{
如果(PropertyChanged!=null)PropertyChanged(这是新的PropertyChangedEventArgs(“IsParametersOkay”);
}
公共图书馆IsParametersOkay
{
获取{return Parameters.FirstOrDefault(p=>p.Value<0)==null;}
}
}
公共类参数:INotifyPropertyChanged
{
双val;
公共双重价值
{ 
获取{return val;}
设置{val=value;if(PropertyChanged!=null)PropertyChanged(这是新的PropertyChangedEventArgs(“value”);}
}
公共字符串名称{get;set;}
公共事件属性更改事件处理程序属性更改;
公共参数(字符串名称,双值){name=name;value=value;}
}
}
退房


这就是我解决问题的方法。也许这不是一个非常优雅的解决方案,但它是有效的

我在MainWindow类中添加了一个新属性IsFormOkay,它检查控件和参数的有效性。然后我将Button.IsEnabled绑定到此属性,并为TextBox添加了TextChanged事件以通知有关IsFormOkay的信息

以下是添加到主窗口的代码:

    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsFormOkay { get { return IsValid(Items) && MyObject.IsParametersOkay; } }

    public bool IsValid(DependencyObject obj)
    {
        if (Validation.GetHasError(obj)) return false;
        for (int i = 0, n = VisualTreeHelper.GetChildrenCount(obj); i < n; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (!IsValid(child)) return false;
        }
        return true;
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsFormOkay"));
    }
public event propertychangedventhandler PropertyChanged;
public bool isformok{get{return IsValid(Items)&&MyObject.IsParametersOkay;}}
公共布尔值有效(DependencyObject对象)
{
if(Validation.GetHasError(obj))返回false;
for(int i=0,n=VisualTreeHelper.GetChildrenCount(obj);i
以及对XAML的更改:

<StackPanel>
    <ItemsControl x:Name="Items" ItemsSource="{Binding Path=MyObject.Parameters}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" />
                    <TextBox TextChanged="TextBox_TextChanged" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button IsEnabled="{Binding Path=IsFormOkay}" Content="OK" />
</StackPanel>

我应该如何编写条件以检查文本框验证错误?
    public event PropertyChangedEventHandler PropertyChanged;

    public bool IsFormOkay { get { return IsValid(Items) && MyObject.IsParametersOkay; } }

    public bool IsValid(DependencyObject obj)
    {
        if (Validation.GetHasError(obj)) return false;
        for (int i = 0, n = VisualTreeHelper.GetChildrenCount(obj); i < n; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (!IsValid(child)) return false;
        }
        return true;
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsFormOkay"));
    }
<StackPanel>
    <ItemsControl x:Name="Items" ItemsSource="{Binding Path=MyObject.Parameters}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" />
                    <TextBox TextChanged="TextBox_TextChanged" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button IsEnabled="{Binding Path=IsFormOkay}" Content="OK" />
</StackPanel>