gpt4 book ai didi

c# - 当依赖项依赖的变量或字段发生更改时更新依赖项属性

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:48 26 4
gpt4 key购买 nike

我需要做的是?

我需要做出一个依赖属性应该依赖的表达式。

假设如下:

Count = dependOne + dependTwo;


在这里, Count是依赖项属性,而 dependOnedependTwo是依赖项属性 Count应当依赖的两个变量。

现在,每当我更改变量 dependOnedependTwo时,依赖项属性都必须自动更新。

可能吗?如果是,那怎么办?

见下面的代码

XAML:

<Window x:Class="DependecnyProperty.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">
<Grid>
<TextBox Background="LightGray" Text="{Binding Path=Count}" Height="23" HorizontalAlignment="Left" Margin="164,102,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="164,148,0,0" Name="button1" VerticalAlignment="Top" Width="120" Click="button1_Click" />
</Grid>
</Window>


代码如下:

namespace DependecnyProperty
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

public MainWindow()
{
InitializeComponent();
this.DataContext = this;

Count = dependOne + dependTwo;
}

int dependOne = 0;
int dependTwo = 0;

public int Count
{
get { return (int)GetValue(CountProperty); }
set { SetValue(CountProperty, value); }
}

// Using a DependencyProperty as the backing store for Count. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CountProperty =
DependencyProperty.Register("Count", typeof(int), typeof(MainWindow), new UIPropertyMetadata(12));

private void button1_Click(object sender, RoutedEventArgs e)
{
dependOne = dependOne + 2;
dependTwo = dependTwo + 1;

//I need to find way ...now here i have changed value of two variable.
//now it is possible to change Dependency Property
//Without here setting the value of dependency property
}


}
}


编辑更新的代码隐藏:

namespace DependecnyProperty
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ViewModel vm;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;

vm = new ViewModel();
//this.DataContext = vm;
Count = vm.DependOne + vm.DependTwo;
}


public int Count
{
get { return (int)GetValue(CountProperty); }
set { SetValue(CountProperty, value); }
}

// Using a DependencyProperty as the backing store for Count. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CountProperty =
DependencyProperty.Register("Count", typeof(int), typeof(MainWindow), new UIPropertyMetadata(12));

private void button1_Click(object sender, RoutedEventArgs e)
{
vm.DependOne++;
vm.DependTwo++;
//I need to find way ...now here i have changed value of two variable.
//now it is possible to change Dependency Property
//Without here setting the value of dependency property

}

public class ViewModel : INotifyPropertyChanged
{

public ViewModel()
{

}

private int dependOne;

public int DependOne
{
get
{
return dependOne;
}
set
{
dependOne = value;
OnPropertyChanged("DependOne");
}
}

private int dependTwo;

public int DependTwo
{
get
{
return dependTwo;
}
set
{
dependTwo = value;
OnPropertyChanged("DependTwo");
}
}

#region -- INotifyPropertyChanged Members --

public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyNameArg)
{
PropertyChangedEventHandler handler = this.PropertyChanged;

if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyNameArg));
}
}
#endregion
}
}
}

最佳答案

我不知道什么是最适合您的解决方案。但是,其中之一是您使用Property,例如:

    //field
private int _dependOne;

//property
public int DependOne
{
get { return _dependOne; }
set {
_dependOne = value;
Count += value;
}
}

//Finally, use the property instead of the field
//dependOne = dependOne + 2;
DependOne += 2;




更新:
重要的是您不要在Codebehind中更新ViewModel属性。相反,您可以调用ViewModel方法。

XAML

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">

<StackPanel>
<StackPanel.Resources>
<Local:MyConverter x:Key="myConverter"/>
</StackPanel.Resources>
<TextBox>
<TextBox.Text>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="DependOne" Mode="OneWay"/>
<Binding Path="DependTwo" Mode="OneWay"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
<Button Click="button1_Click">click</Button>
</StackPanel>
</Window>




public partial class MainWindow : Window
{
ViewModel vm;
public MainWindow()
{
InitializeComponent();

vm = new ViewModel();
this.DataContext = vm;
}


//public int Count
//{
// get { return (int)GetValue(CountProperty); }
// set { SetValue(CountProperty, value); }
//}

//// Using a DependencyProperty as the backing store for Count. This enables animation, styling, binding, etc...
//public static readonly DependencyProperty CountProperty =
// DependencyProperty.Register("Count", typeof(int), typeof(MainWindow), new UIPropertyMetadata(12));

private void button1_Click(object sender, RoutedEventArgs e)
{
vm.UpdateCount();
}


}

public class ViewModel : INotifyPropertyChanged
{

public ViewModel()
{

}

private int dependOne = 0;

public int DependOne
{
get
{
return dependOne;
}
set
{
dependOne = value;
OnPropertyChanged("DependOne");
}
}

private int dependTwo = 0;

public int DependTwo
{
get
{
return dependTwo;
}
set
{
dependTwo = value;
OnPropertyChanged("DependTwo");
}
}

#region -- INotifyPropertyChanged Members --

public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyNameArg)
{
PropertyChangedEventHandler handler = this.PropertyChanged;

if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyNameArg));
}
}
#endregion

internal void UpdateCount()
{
DependOne = 3;
DependTwo = 4;
}
}

public class MyConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var dependOne = (int)values[0];
var dependTwo = (int)values[1];

return (dependOne + dependTwo).ToString();
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

关于c# - 当依赖项依赖的变量或字段发生更改时更新依赖项属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6716203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com