none
關於WPF Binding 與其他新手問題 RRS feed

  • 問題

  • WPF有適合發問的版嗎?


    MSDN WPF簡介

    Q1.網址 資料繫結部分

    xaml檔
    x:Class="SDKSample.DataBindingWindow">

    <TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />

    cs檔 Class卻不是DataBindingWindow , 還是我理解錯誤 標記的不是Class名稱?


    Q2.我自行嘗試 ,  當我點擊button 程式碼有觸發 但是UI卻沒有變化 , 是不是哪裡錯誤了?

    cs檔

    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            public string BText { get; set; }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                BText += "123";
            }

    xaml檔案

    x:Class="WpfApp1.MainWindow"

    <Button Content="{Binding Path=BText}"

    Q3.設計介面 控制項 屬性都有DataContent 點選後 跳出選取Class的Resources或Settings

    並且xaml多出

    <Button.DataContext> 

    <Properties:Resources/>

    </Button.DataContext>

    想請問該如何使用?

    Q4.一般windows form 可以很直接的使用控制項的成員

    例如listview.items  ,  button.enable  等等

    想請問WPF都如何控制控制項呢?

    • 已編輯 StuBoo 2018年8月10日 上午 07:43
    2018年8月10日 上午 07:38

解答

  • 我略為猜測一下你想做些甚麼寫了一個 Sample (為了避免不好懂,我把 ViewModel 的 code 放在 MainWindow 中,一般是會分開寫的)

    <Window x:Class="WpfApp3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp3"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.DataContext >
            <local:ViewModel />
        </Window.DataContext> 
        <Grid>
            <Button Content="{Binding BtText}" FontSize="15" Margin="12" Click="Button_Click" Height="72"/>
        </Grid>
    </Window>

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApp3
    {
        /// <summary>
        /// MainWindow.xaml 的互動邏輯
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                var data = (ViewModel) this.DataContext;
                data.BtText += "123";
            }
        }
    
    
        public class ViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            private string _btText;
    
            public string BtText
            {
                get { return _btText; }
                set
                {
                    if (_btText != value)
                    {
                        _btText = value;
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(BtText)));
                    }
                }
            }
        }
    }
    


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月10日 上午 10:00
    2018年8月10日 上午 08:13
    版主
  • 因為你的 BText 屬性沒有做所謂的 "屬性變更通知"

    前面回的程式碼中,  ViewModel Class 有 implement INotifyPropertyChanged interface

    屬性 BtText 在 setter 裡如果發現值有被改變,就會引發 NotifyPropertyChanged 事件。

    WPF Binding-Engine 會收到這個事件的通知,然後通知 UI 的相關屬性變更。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月14日 上午 09:19
    2018年8月10日 上午 10:52
    版主
  • 對了, 一般 WPF 是發在 https://social.msdn.microsoft.com/Forums/zh-TW/home?forum=802&filter=alltypes&sort=lastpostdesc

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月14日 上午 09:19
    2018年8月10日 上午 10:54
    版主

所有回覆

  • Q1:

    XAML 和 code behind cs 的對應是這樣的

    如果 XAML 是 x:Class="SDKSample.DataBindingWindow"

    對應的 c# code 就是位於 SDKSample 命名空間下的 DataBindingWindow class

    (如果不是,你就手動修改 cs 或是 xaml 部分讓他們對應上)

    Q2: 你的 Button Click event 是否有和 Button_Click 函式繫結上,在你貼的 code 上看不出來

    Q3: DataContext 屬性是用來繫結資料來源,你可以繫結到一個類別的執行個體。其實就是 xxx.DataContext = 某個東西 這樣的設定而已。

    Q4: WPF 的控制項比起 Windows Forms 的靈活度要高得多,類似的屬性通常也有。但 WPF 可以做高度靈活的組合,所以她的控制方式也是多彩多姿。

    WPF 的入門門檻比起 Windows Forms 稍高,不過一旦突破障礙,做出來的東西就會飛快地超越過 Windows Forms 所能達成的。
    我覺得對初學者入手 WPF 最容易的是這本書 (不過現在有點難買到,以前本來天瓏還賣 199 的)

    WPF 與 XAML 應用程式開發講座


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2018年8月10日 上午 08:02
    版主
  • 我略為猜測一下你想做些甚麼寫了一個 Sample (為了避免不好懂,我把 ViewModel 的 code 放在 MainWindow 中,一般是會分開寫的)

    <Window x:Class="WpfApp3.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp3"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.DataContext >
            <local:ViewModel />
        </Window.DataContext> 
        <Grid>
            <Button Content="{Binding BtText}" FontSize="15" Margin="12" Click="Button_Click" Height="72"/>
        </Grid>
    </Window>

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApp3
    {
        /// <summary>
        /// MainWindow.xaml 的互動邏輯
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                var data = (ViewModel) this.DataContext;
                data.BtText += "123";
            }
        }
    
    
        public class ViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            private string _btText;
    
            public string BtText
            {
                get { return _btText; }
                set
                {
                    if (_btText != value)
                    {
                        _btText = value;
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(BtText)));
                    }
                }
            }
        }
    }
    


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月10日 上午 10:00
    2018年8月10日 上午 08:13
    版主
  • 感謝您提供的方式

    但是還是想請教我的為甚麼沒有用處,確認click事件有觸發 並且屬性也有變更  但是就是UI沒有變化

    下列附上程式碼

    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的互動邏輯
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            public string BText { get; set; }
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                BText += "123";
            }
        }
    <Window 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            xmlns:Properties="clr-namespace:WpfApp1.Properties" x:Class="WpfApp1.MainWindow"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Grid.Background>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="#FF9E4848" Offset="1"/>
                </LinearGradientBrush>
            </Grid.Background>
            <Button Content="{Binding Path=BText}" HorizontalAlignment="Left" Margin="20,141,0,0" VerticalAlignment="Top" Width="705" Height="88" Click="Button_Click_1"/>
        </Grid>
    </Window>



    • 已編輯 StuBoo 2018年8月10日 上午 10:05
    2018年8月10日 上午 10:04
  • 因為你的 BText 屬性沒有做所謂的 "屬性變更通知"

    前面回的程式碼中,  ViewModel Class 有 implement INotifyPropertyChanged interface

    屬性 BtText 在 setter 裡如果發現值有被改變,就會引發 NotifyPropertyChanged 事件。

    WPF Binding-Engine 會收到這個事件的通知,然後通知 UI 的相關屬性變更。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月14日 上午 09:19
    2018年8月10日 上午 10:52
    版主
  • 對了, 一般 WPF 是發在 https://social.msdn.microsoft.com/Forums/zh-TW/home?forum=802&filter=alltypes&sort=lastpostdesc

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2018年8月14日 上午 09:19
    2018年8月10日 上午 10:54
    版主